From 731d27bba427dd003010de2bf5c099e3dad881b1 Mon Sep 17 00:00:00 2001 From: yuukiiwa Date: Thu, 2 Dec 2021 15:26:35 +0800 Subject: [PATCH 001/169] move samtools outside align processes --- subworkflows/local/align_graphmap2.nf | 12 +----------- subworkflows/local/align_minimap2.nf | 12 +----------- workflows/nanoseq.nf | 22 ++++++++++++++-------- 3 files changed, 16 insertions(+), 30 deletions(-) diff --git a/subworkflows/local/align_graphmap2.nf b/subworkflows/local/align_graphmap2.nf index ffbecd5a..4e5f3d2b 100644 --- a/subworkflows/local/align_graphmap2.nf +++ b/subworkflows/local/align_graphmap2.nf @@ -36,17 +36,7 @@ workflow ALIGN_GRAPHMAP2 { GRAPHMAP2_ALIGN ( ch_index ) ch_align_sam = GRAPHMAP2_ALIGN.out.align_sam - /* - * Convert SAM to BAM, sort, index BAM file and run samtools stats, flagstat and idxstats - */ - BAM_SORT_SAMTOOLS ( ch_align_sam ) - ch_sortbam = BAM_SORT_SAMTOOLS.out.sortbam - ch_sortbam_stats_multiqc = BAM_SORT_SAMTOOLS.out.sortbam_stats_multiqc - samtools_version = BAM_SORT_SAMTOOLS.out.versions - emit: graphmap2_version - ch_sortbam - ch_sortbam_stats_multiqc - samtools_version + ch_align_sam } diff --git a/subworkflows/local/align_minimap2.nf b/subworkflows/local/align_minimap2.nf index 50d5b292..48ff2300 100644 --- a/subworkflows/local/align_minimap2.nf +++ b/subworkflows/local/align_minimap2.nf @@ -36,17 +36,7 @@ workflow ALIGN_MINIMAP2 { MINIMAP2_ALIGN ( ch_index ) ch_align_sam = MINIMAP2_ALIGN.out.align_sam - /* - * Convert SAM to BAM, sort, index BAM file and run samtools stats, flagstat and idxstats - */ - BAM_SORT_SAMTOOLS ( ch_align_sam ) - ch_sortbam = BAM_SORT_SAMTOOLS.out.sortbam - ch_sortbam_stats_multiqc = BAM_SORT_SAMTOOLS.out.sortbam_stats_multiqc - samtools_version = BAM_SORT_SAMTOOLS.out.versions - emit: minimap2_version - ch_sortbam - ch_sortbam_stats_multiqc - samtools_version + ch_align_sam } diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index f6c94fc7..c35b07b2 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -136,8 +136,9 @@ def dexseq_options = modules['dexseq'] include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( genome_options: genome_options ) -include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options, samtools_options: samtools_sort_options ) -include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options, samtools_options: samtools_sort_options ) +include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options ) +include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options ) +include { BAM_SORT_SAMTOOLS } from '../subworkflows/local/bam_sort_samtools' addParams( samtools_options: samtools_sort_options ) include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtools_ucsc_bigwig' addParams( bigwig_options: bigwig_options ) include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' addParams( bigbed_options: bigbed_options ) include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' addParams( stringtie2_options: stringtie2_options, featurecounts_options: featurecounts_options ) @@ -308,22 +309,27 @@ workflow NANOSEQ{ * SUBWORKFLOW: Align fastq files with minimap2 and sort bam files */ ALIGN_MINIMAP2 ( ch_fasta_index, ch_fastq ) - ch_view_sortbam = ALIGN_MINIMAP2.out.ch_sortbam + ch_align_sam = ALIGN_MINIMAP2.out.ch_align_sam ch_software_versions = ch_software_versions.mix(ALIGN_MINIMAP2.out.minimap2_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(ALIGN_MINIMAP2.out.samtools_version.first().ifEmpty(null)) - ch_samtools_multiqc = ALIGN_MINIMAP2.out.ch_sortbam_stats_multiqc.ifEmpty([]) } else { /* * SUBWORKFLOW: Align fastq files with graphmap2 and sort bam files */ ALIGN_GRAPHMAP2 ( ch_fasta_index, ch_fastq ) - ch_view_sortbam = ALIGN_GRAPHMAP2.out.ch_sortbam + ch_align_sam = ALIGN_GRAPHMAP2.out.ch_align_sam ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.graphmap2_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.samtools_version.first().ifEmpty(null)) - ch_samtools_multiqc = ALIGN_GRAPHMAP2.out.ch_sortbam_stats_multiqc.ifEmpty([]) } + //if (DNA structural variant){ + // Your merged samtools sort and index module + //}else{ + BAM_SORT_SAMTOOLS ( ch_sam ) + ch_view_sortbam = BAM_SORT_SAMTOOLS.out.sortbam + ch_software_versions = ch_software_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first().ifEmpty(null)) + ch_samtools_multiqc = ALIGN_GRAPHMAP2.out.sortbam_stats_multiqc.ifEmpty([]) + //} + ch_bedtools_version = Channel.empty() if (!params.skip_bigwig){ From f73b71ea42fdb7853cd51d6ff6226c219be9cbda Mon Sep 17 00:00:00 2001 From: yuukiiwa Date: Thu, 2 Dec 2021 15:30:32 +0800 Subject: [PATCH 002/169] fix linting error --- workflows/nanoseq.nf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index c35b07b2..5e78da24 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -321,14 +321,14 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.graphmap2_version.first().ifEmpty(null)) } - //if (DNA structural variant){ - // Your merged samtools sort and index module - //}else{ - BAM_SORT_SAMTOOLS ( ch_sam ) + //if (DNA structural variant){ + // Your merged samtools sort and index module + //}else{ + BAM_SORT_SAMTOOLS ( ch_align_sam ) ch_view_sortbam = BAM_SORT_SAMTOOLS.out.sortbam ch_software_versions = ch_software_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first().ifEmpty(null)) ch_samtools_multiqc = ALIGN_GRAPHMAP2.out.sortbam_stats_multiqc.ifEmpty([]) - //} + //} ch_bedtools_version = Channel.empty() if (!params.skip_bigwig){ From 9da5f8376a5da74d3e7726d9783870cde563c44c Mon Sep 17 00:00:00 2001 From: yuukiiwa Date: Thu, 2 Dec 2021 15:39:17 +0800 Subject: [PATCH 003/169] fix error --- subworkflows/local/align_graphmap2.nf | 1 - subworkflows/local/align_minimap2.nf | 1 - workflows/nanoseq.nf | 2 +- 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/subworkflows/local/align_graphmap2.nf b/subworkflows/local/align_graphmap2.nf index 4e5f3d2b..858cf057 100644 --- a/subworkflows/local/align_graphmap2.nf +++ b/subworkflows/local/align_graphmap2.nf @@ -8,7 +8,6 @@ params.samtools_options = [:] include { GRAPHMAP2_INDEX } from '../../modules/local/graphmap2_index' addParams( options: params.index_options ) include { GRAPHMAP2_ALIGN } from '../../modules/local/graphmap2_align' addParams( options: params.align_options ) -include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' addParams( options: params.samtools_options ) workflow ALIGN_GRAPHMAP2 { take: diff --git a/subworkflows/local/align_minimap2.nf b/subworkflows/local/align_minimap2.nf index 48ff2300..667a1c35 100644 --- a/subworkflows/local/align_minimap2.nf +++ b/subworkflows/local/align_minimap2.nf @@ -8,7 +8,6 @@ params.samtools_options = [:] include { MINIMAP2_INDEX } from '../../modules/local/minimap2_index' addParams( options: params.index_options ) include { MINIMAP2_ALIGN } from '../../modules/local/minimap2_align' addParams( options: params.align_options ) -include { BAM_SORT_SAMTOOLS } from './bam_sort_samtools' addParams( options: params.samtools_options ) workflow ALIGN_MINIMAP2 { take: diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 5e78da24..bbf0475f 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -327,7 +327,7 @@ workflow NANOSEQ{ BAM_SORT_SAMTOOLS ( ch_align_sam ) ch_view_sortbam = BAM_SORT_SAMTOOLS.out.sortbam ch_software_versions = ch_software_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first().ifEmpty(null)) - ch_samtools_multiqc = ALIGN_GRAPHMAP2.out.sortbam_stats_multiqc.ifEmpty([]) + ch_samtools_multiqc = BAM_SORT_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) //} ch_bedtools_version = Channel.empty() From 54c2e06f47f21c32e4ee45a68252485740b031e9 Mon Sep 17 00:00:00 2001 From: yuukiiwa Date: Thu, 2 Dec 2021 15:49:54 +0800 Subject: [PATCH 004/169] fix samtools sort error --- modules/nf-core/modules/samtools/sort/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index b30f6f45..bfe8d8a1 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -28,7 +28,7 @@ process SAMTOOLS_SORT { script: def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ - samtools sort $options.args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam + samtools sort $options.args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') From 17b2fcf503fb38e046525b25aa71e0c8e357e04f Mon Sep 17 00:00:00 2001 From: Chen Ying Date: Mon, 6 Dec 2021 21:50:31 +0800 Subject: [PATCH 005/169] update bambu version --- modules/local/bambu.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/bambu.nf b/modules/local/bambu.nf index fab6d607..9549390f 100644 --- a/modules/local/bambu.nf +++ b/modules/local/bambu.nf @@ -10,7 +10,7 @@ process BAMBU { mode: params.publish_dir_mode, saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } - conda (params.enable_conda ? "conda-forge::r-base=4.0.3 bioconda::bioconductor-bambu=1.0.2 bioconda::bioconductor-bsgenome=1.58.0" : null) + conda (params.enable_conda ? "conda-forge::r-base=4.0.3 bioconda::bioconductor-bambu=2.0.0 bioconda::bioconductor-bsgenome=1.58.0" : null) container "docker.io/yuukiiwa/nanoseq:bambu_bsgenome" input: From fa43fcf83afef48424c8035132cc375554d543a7 Mon Sep 17 00:00:00 2001 From: Chen Ying Date: Mon, 6 Dec 2021 21:53:48 +0800 Subject: [PATCH 006/169] remove doi link badge --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 609b5506..44666d41 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,6 @@ [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Docker](https://img.shields.io/docker/automated/nfcore/nanoseq.svg)](https://hub.docker.com/r/nfcore/nanoseq) -[![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.3697959.svg)](https://doi.org/10.5281/zenodo.3697959) [![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23nanoseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/nanoseq) [![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core) From d5a9659f934c89a3b29baefa6cabf154ea634367 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Mon, 13 Dec 2021 10:39:22 +0100 Subject: [PATCH 007/169] Initial commit adding small and structural variant calling --- conf/modules.config | 9 +++ conf/test_full.config | 18 +++--- conf/test_nobc_nodx_vc.config | 26 +++++++++ modules/local/medaka_variant.nf | 49 ++++++++++++++++ modules/local/minimap2_align.nf | 2 + modules/local/samtools_sort_index.nf | 41 +++++++++++++ modules/local/sniffles.nf | 42 ++++++++++++++ nextflow.config | 6 ++ nextflow_schema.json | 23 ++++++++ subworkflows/local/align_graphmap2.nf | 3 +- subworkflows/local/align_minimap2.nf | 1 + subworkflows/local/bam_sort_index_samtools.nf | 37 ++++++++++++ .../local/quantify_stringtie_featurecounts.nf | 2 +- subworkflows/local/sv_sniffles.nf | 23 ++++++++ subworkflows/local/vc_medaka.nf | 42 ++++++++++++++ workflows/nanoseq.nf | 57 +++++++++++++++---- 16 files changed, 359 insertions(+), 22 deletions(-) create mode 100644 conf/test_nobc_nodx_vc.config create mode 100644 modules/local/medaka_variant.nf create mode 100644 modules/local/samtools_sort_index.nf create mode 100644 modules/local/sniffles.nf create mode 100644 subworkflows/local/bam_sort_index_samtools.nf create mode 100644 subworkflows/local/sv_sniffles.nf create mode 100644 subworkflows/local/vc_medaka.nf diff --git a/conf/modules.config b/conf/modules.config index 4bfd2566..ab9531fd 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -69,6 +69,15 @@ params { publish_files = ['stats':'samtools_stats', 'flagstat':'samtools_stats', 'idxstats':'samtools_stats', 'bam':'bam', 'bai':'bam'] publish_dir = "${params.aligner}" } + 'medaka_vc' { + publish_dir = "${params.aligner}" + publish_files = ['.vcf':'medaka'] + args = '-s r941_prom_hac_snp_g507 -m r941_prom_hac_variant_g507' + } + 'sniffles_sv' { + publish_dir = "${params.aligner}" + publish_files = ['.vcf':'sniffles'] + } 'bedtools_genomecov' { publish_files = false } diff --git a/conf/test_full.config b/conf/test_full.config index 06d846dd..52ce3ec1 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -10,13 +10,13 @@ ---------------------------------------------------------------------------------------- */ -params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' - - // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_full.csv' - protocol = 'cDNA' - skip_basecalling = true - skip_demultiplexing = true +params { + config_profile_name = 'Full test profile' + config_profile_description = 'Full test dataset to check pipeline function' + + // Input data for full size test + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_full.csv' + protocol = 'cDNA' + skip_basecalling = true + skip_demultiplexing = true } \ No newline at end of file diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config new file mode 100644 index 00000000..b8463f9a --- /dev/null +++ b/conf/test_nobc_nodx_vc.config @@ -0,0 +1,26 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: + * nextflow run nf-core/nanoseq -profile test_nobc_nodx_vc, + */ + +params { + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check variant calling functions' + + // Limit resources so that this can run on Travis + max_cpus = 2 + max_memory = 6.GB + max_time = 12.h + + // Input data to skip basecalling and demultiplexing, and variant call + input = 'https://raw.githubusercontent.com//christopher-hakkaart/testdata/main/samplesheet_nobc_vc.csv' + protocol = 'DNA' + skip_basecalling = true + skip_quantification = true + skip_demultiplexing = true + call_variants = true +} diff --git a/modules/local/medaka_variant.nf b/modules/local/medaka_variant.nf new file mode 100644 index 00000000..89009664 --- /dev/null +++ b/modules/local/medaka_variant.nf @@ -0,0 +1,49 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +def options = initOptions(params.options) + +process MEDAKA { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + conda (params.enable_conda ? "bioconda::medaka=1.4.4" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container 'https://depot.galaxyproject.org/singularity/medaka:1.4.4--py38h130def0_0' + } else { + container 'quay.io/biocontainers/medaka:1.4.4--py38h130def0_0' + } + + input: + tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) // + path(fasta) + + output: + path ("${meta.id}/round_1.vcf") , emit: variant_calls // vcf files + path "versions.yml" , emit: versions + + script: + def args = options.args ?: '' + def split_mnps = params.split_mnps ? "-l" : '' + def phase_vcf = params.phase_vcf ? "-p" : '' + """ + medaka_variant \\ + -d \\ + -f $fasta \\ + -i $bam \\ + -o ${meta.id}/ \\ + -t $task.cpus \\ + $split_mnps \\ + $phase_vcf \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + medaka: \$( medaka --version 2>&1 | sed 's/medaka //g' ) + END_VERSIONS + """ +} diff --git a/modules/local/minimap2_align.nf b/modules/local/minimap2_align.nf index 0ad6a729..5c63ea7d 100644 --- a/modules/local/minimap2_align.nf +++ b/modules/local/minimap2_align.nf @@ -30,12 +30,14 @@ process MINIMAP2_ALIGN { def kmer = (params.protocol == 'directRNA') ? "-k14" : "" def stranded = (params.stranded || params.protocol == 'directRNA') ? "-uf" : "" def junctions = (params.protocol != 'DNA' && bed) ? "--junc-bed ${file(bed)}" : "" + def md = (params.call_variants && params.protocol == 'DNA') ? "--MD" : "" """ minimap2 \\ $preset \\ $kmer \\ $stranded \\ $junctions \\ + $md \\ -t $task.cpus \\ $index \\ $fastq > ${meta.id}.sam diff --git a/modules/local/samtools_sort_index.nf b/modules/local/samtools_sort_index.nf new file mode 100644 index 00000000..cd625e23 --- /dev/null +++ b/modules/local/samtools_sort_index.nf @@ -0,0 +1,41 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +def options = initOptions(params.options) + +process SAMTOOLS_SORT_INDEX { + tag "$meta.id" + label 'process_low' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0" + } else { + container "quay.io/biocontainers/samtools:1.14--hb421002_0" + } + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*sorted.bam"), path("*.bai") , optional:true, emit: bam_bai + tuple val(meta), path("*sorted.bam"), path("*.csi") , optional:true, emit: bam_csi + path "versions.yml" , emit: versions + + script: + def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + """ + samtools sort $options.args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam + + samtools index $options.args ${prefix}.sorted.bam + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} \ No newline at end of file diff --git a/modules/local/sniffles.nf b/modules/local/sniffles.nf new file mode 100644 index 00000000..c07e3603 --- /dev/null +++ b/modules/local/sniffles.nf @@ -0,0 +1,42 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +def options = initOptions(params.options) + +process SNIFFLES { + tag "$meta.id" + label 'process_high' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } + + conda (params.enable_conda ? "bioconda::sniffles=1.0.12" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container 'https://depot.galaxyproject.org/singularity/sniffles:1.0.12--h8b12597_1' + } else { + container 'quay.io/biocontainers/sniffles:1.0.12--h8b12597_1' + } + + input: + tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) + + + output: + path "*_sniffles.vcf" , emit: sv_calls // vcf files + path "versions.yml" , emit: versions + + + script: + """ + sniffles \ + -m $bam \ + -v ${meta.id}_sniffles.vcf \ + -t $task.cpus + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") + END_VERSIONS + """ +} \ No newline at end of file diff --git a/nextflow.config b/nextflow.config index 76de0fdc..be766fbc 100644 --- a/nextflow.config +++ b/nextflow.config @@ -41,6 +41,11 @@ params { save_align_intermeds = false skip_alignment = false + // Options: Variant calling + call_variants = false + split_mnps = false + phase_vcf = false + // Options: Visualisation skip_bigbed = false skip_bigwig = false @@ -178,6 +183,7 @@ profiles { test_nobc_dx { includeConfig 'conf/test_nobc_dx.config' } test_nobc_nodx { includeConfig 'conf/test_nobc_nodx.config' } test_nobc_nodx_noaln { includeConfig 'conf/test_nobc_nodx_noaln.config' } + test_nobc_nodx_vc { includeConfig 'conf/test_nobc_nodx_vc.config' } } // Export these variables to prevent local Python/R libraries from conflicting with those in the container diff --git a/nextflow_schema.json b/nextflow_schema.json index 4d046201..bc80f2fe 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -187,6 +187,29 @@ } } }, + "variant_calling_options": { + "title": "Variant calling options", + "description": "Options to adjust pameters and filtering criteria for varinat calling.", + "default": "", + "fa_icon": "fas fa-align-center", + "properties": { + "call_variants": { + "type": "boolean", + "description": "Specifies if variants will be called.", + "fa_icon": "fas fa-exchange-alt" + }, + "split_mnps": { + "type": "boolean", + "description": "Specifies if MNPs will be split into SNPs.", + "fa_icon": "fas fa-file-alt" + }, + "phase_vcf": { + "type": "boolean", + "fa_icon": "fas fa-exchange-alt", + "description": "Specifies if vcf will be phased." + } + } + }, "differential_analysis_options": { "title": "Differential analysis options", "description": "Options to adjust quantification and differential analysis", diff --git a/subworkflows/local/align_graphmap2.nf b/subworkflows/local/align_graphmap2.nf index 858cf057..7e736e00 100644 --- a/subworkflows/local/align_graphmap2.nf +++ b/subworkflows/local/align_graphmap2.nf @@ -28,7 +28,7 @@ workflow ALIGN_GRAPHMAP2 { .collate(13) .map { it -> [ it[6], it[7], it[0], it[1], it[2], it[3], it[10], it[4] ] } // [ sample, fastq, fasta, sizes, gtf, bed, is_transcripts, index ] .set { ch_index } - + /* * Map reads with GRAPHMAP2 */ @@ -36,6 +36,7 @@ workflow ALIGN_GRAPHMAP2 { ch_align_sam = GRAPHMAP2_ALIGN.out.align_sam emit: + ch_index graphmap2_version ch_align_sam } diff --git a/subworkflows/local/align_minimap2.nf b/subworkflows/local/align_minimap2.nf index 667a1c35..8e1598a8 100644 --- a/subworkflows/local/align_minimap2.nf +++ b/subworkflows/local/align_minimap2.nf @@ -36,6 +36,7 @@ workflow ALIGN_MINIMAP2 { ch_align_sam = MINIMAP2_ALIGN.out.align_sam emit: + ch_index minimap2_version ch_align_sam } diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf new file mode 100644 index 00000000..75e50bee --- /dev/null +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -0,0 +1,37 @@ +/* + * Sort, index BAM file and run samtools stats, flagstat and idxstats + */ + +params.options = [:] + +include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' addParams( options: params.options ) +include { SAMTOOLS_SORT_INDEX } from '../../modules/local/samtools_sort_index' addParams( options: params.options ) +include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' addParams( options: params.options ) + +workflow BAM_SORT_INDEX_SAMTOOLS { + take: + ch_sam // channel: [ val(meta), [ bam ] ] + + main: + SAMTOOLS_VIEW_BAM ( ch_sam ) + + SAMTOOLS_SORT_INDEX( SAMTOOLS_VIEW_BAM.out.bam ) + + ch_sam + .join( SAMTOOLS_SORT_INDEX.out.bam_bai ) + .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } + .set { sortbam } + + BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT_INDEX.out.bam_bai ) + BAM_STATS_SAMTOOLS.out.stats + .join ( BAM_STATS_SAMTOOLS.out.idxstats ) + .join ( BAM_STATS_SAMTOOLS.out.flagstat ) + .map { it -> [ it[1], it[2], it[3] ] } + .set { sortbam_stats_multiqc } + versions = BAM_STATS_SAMTOOLS.out.versions + + emit: + sortbam + sortbam_stats_multiqc + versions +} diff --git a/subworkflows/local/quantify_stringtie_featurecounts.nf b/subworkflows/local/quantify_stringtie_featurecounts.nf index 29359847..bab6e6b1 100644 --- a/subworkflows/local/quantify_stringtie_featurecounts.nf +++ b/subworkflows/local/quantify_stringtie_featurecounts.nf @@ -5,7 +5,7 @@ params.stringtie2_options = [:] params.featurecounts_options = [:] -include { STRINGTIE2 } from '../../modules/local/stringtie2' addParams( options: params.stringtie2_options ) +include { STRINGTIE2 } from '../../modules/local/stringtie2' addParams( options: params.stringtie2_options ) include { STRINGTIE_MERGE } from '../../modules/nf-core/modules/stringtie/merge/main' addParams( options: params.stringtie2_options ) include { SUBREAD_FEATURECOUNTS } from '../../modules/local/subread_featurecounts' addParams( options: params.featurecounts_options ) diff --git a/subworkflows/local/sv_sniffles.nf b/subworkflows/local/sv_sniffles.nf new file mode 100644 index 00000000..ab32e66f --- /dev/null +++ b/subworkflows/local/sv_sniffles.nf @@ -0,0 +1,23 @@ +/* + * Structural variant calling with SNIFFLES + */ + +params.sniffles_sv_options = [:] + +include { SNIFFLES } from '../../modules/local/sniffles' addParams( options: params.sniffles_sv_options ) + +workflow SV_SNIFFLES { + take: + ch_view_sortbam + + main: + /* + * Call variants with MEDAKA + */ + SNIFFLES( ch_view_sortbam ) + ch_sv_calls = SNIFFLES.out.sv_calls + + emit: + ch_sv_calls + +} \ No newline at end of file diff --git a/subworkflows/local/vc_medaka.nf b/subworkflows/local/vc_medaka.nf new file mode 100644 index 00000000..3918162a --- /dev/null +++ b/subworkflows/local/vc_medaka.nf @@ -0,0 +1,42 @@ +/* + * Small variant calling with MEDAKA + */ + +params.medaka_vc_options = [:] + +include { MEDAKA } from '../../modules/local/medaka_variant' addParams( options: params.medaka_vc_options ) + +workflow VC_MEDAKA { + take: + ch_view_sortbam // + ch_index // + + main: + /* + * Split into a different channel for each chromosome + */ + // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling + //SPLIT_CHROM( ch_view_sortbam ) + //.splitCsv() + //.combine( ch_view_sortbam ) // + //.unique() + //.map { it -> [ it[1], it[4], it[5], it[0] ] } // + //.map{ meta, bam, bai, chrom -> + //new_meta = meta.clone() + //new_meta.chrom = chrom + //[new_meta, bam, bai] + //}.set{ch_bam_vc_chrom} + + /* + * Call variants with MEDAKA + */ + MEDAKA( ch_view_sortbam, ch_index ) + ch_variant_calls = MEDAKA.out.variant_calls + + + // TODO Add module to concatenate variant calls back togehter and index + + emit: + ch_variant_calls + +} \ No newline at end of file diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index bbf0475f..3d20555d 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -106,8 +106,8 @@ def qcat_options = modules['qcat'] def nanolyse_options = modules['nanolyse'] def bambu_options = modules['bambu'] -include { GET_TEST_DATA } from '../modules/local/get_test_data' addParams( options: [:] ) -include { GET_NANOLYSE_FASTA } from '../modules/local/get_nanolyse_fasta' addParams( options: [:] ) +include { GET_TEST_DATA } from '../modules/local/get_test_data' addParams( options: [:] ) +include { GET_NANOLYSE_FASTA } from '../modules/local/get_nanolyse_fasta' addParams( options: [:] ) include { GUPPY } from '../modules/local/guppy' addParams( options: guppy_options ) include { QCAT } from '../modules/local/qcat' addParams( options: qcat_options ) include { BAM_RENAME } from '../modules/local/bam_rename' addParams( options: [:] ) @@ -126,6 +126,8 @@ def graphmap2_index_options = modules['graphmap2_index'] def graphmap2_align_options = modules['graphmap2_align'] def minimap2_index_options = modules['minimap2_index'] def minimap2_align_options = modules['minimap2_align'] +def medaka_vc_options = modules['medaka_vc'] +def sniffles_sv_options = modules['sniffles_sv'] def samtools_sort_options = modules['samtools_sort'] def bigwig_options = modules['ucsc_bedgraphtobigwig'] def bigbed_options = modules['ucsc_bed12tobigbed'] @@ -139,6 +141,9 @@ include { PREPARE_GENOME } from '../subworkflows/local/prepare include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options ) include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options ) include { BAM_SORT_SAMTOOLS } from '../subworkflows/local/bam_sort_samtools' addParams( samtools_options: samtools_sort_options ) +include { BAM_SORT_INDEX_SAMTOOLS } from '../subworkflows/local/bam_sort_index_samtools' addParams( samtools_options: samtools_sort_options ) +include { VC_MEDAKA } from '../subworkflows/local/vc_medaka' addParams( medaka_vc_options: medaka_vc_options ) +include { SV_SNIFFLES } from '../subworkflows/local/sv_sniffles' addParams( sniffles_sv_options: sniffles_sv_options ) include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtools_ucsc_bigwig' addParams( bigwig_options: bigwig_options ) include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' addParams( bigbed_options: bigbed_options ) include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' addParams( stringtie2_options: stringtie2_options, featurecounts_options: featurecounts_options ) @@ -304,12 +309,12 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.samtools_version.first().ifEmpty(null)) ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.gtf2bed_version.first().ifEmpty(null)) if (params.aligner == 'minimap2') { - /* * SUBWORKFLOW: Align fastq files with minimap2 and sort bam files */ ALIGN_MINIMAP2 ( ch_fasta_index, ch_fastq ) ch_align_sam = ALIGN_MINIMAP2.out.ch_align_sam + ch_index = ALIGN_MINIMAP2.out.ch_index ch_software_versions = ch_software_versions.mix(ALIGN_MINIMAP2.out.minimap2_version.first().ifEmpty(null)) } else { @@ -318,17 +323,47 @@ workflow NANOSEQ{ */ ALIGN_GRAPHMAP2 ( ch_fasta_index, ch_fastq ) ch_align_sam = ALIGN_GRAPHMAP2.out.ch_align_sam + ch_index = ALIGN_GRAPHMAP2.out.ch_index ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.graphmap2_version.first().ifEmpty(null)) } - //if (DNA structural variant){ - // Your merged samtools sort and index module - //}else{ - BAM_SORT_SAMTOOLS ( ch_align_sam ) - ch_view_sortbam = BAM_SORT_SAMTOOLS.out.sortbam - ch_software_versions = ch_software_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first().ifEmpty(null)) - ch_samtools_multiqc = BAM_SORT_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - //} + if (params.call_variants) { + /* + * SUBWORKFLOW: View, then sort, and index bam files using one module + */ + BAM_SORT_INDEX_SAMTOOLS ( ch_align_sam ) + ch_view_sortbam = BAM_SORT_INDEX_SAMTOOLS.out.sortbam + ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.versions.first().ifEmpty(null)) + ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) + } else { + + /* + * SUBWORKFLOW: View, then sort and index bam files using two modules + */ + BAM_SORT_SAMTOOLS ( ch_align_sam ) + ch_view_sortbam = BAM_SORT_SAMTOOLS.out.sortbam + ch_software_versions = ch_software_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first().ifEmpty(null)) + ch_samtools_multiqc = BAM_SORT_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) + } + + + if (params.call_variants && params.protocol == 'DNA') { + /* + * SUBWORKFLOW: Call variants with medaka + */ + ch_medaka_version = Channel.empty() + VC_MEDAKA ( ch_view_sortbam, ch_index.map{ it [2] } ) + ch_medaka_vc = VC_MEDAKA.out.ch_variant_calls + } + + if (params.call_variants && params.protocol == 'DNA') { + /* + * SUBWORKFLOW: Call structural variants with sniffles + */ + ch_sniffles_version = Channel.empty() + SV_SNIFFLES ( ch_view_sortbam ) + ch_sniffles_sv = SV_SNIFFLES.out.ch_sv_calls + } ch_bedtools_version = Channel.empty() if (!params.skip_bigwig){ From c92e207bd9c2bbc50785ede7a35836589b0119d7 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 13 Dec 2021 21:01:30 +0800 Subject: [PATCH 008/169] put all samtools in one subworkflow and fix linting errors --- modules/local/medaka_variant.nf | 2 +- modules/local/samtools_sort_index.nf | 3 +- modules/local/sniffles.nf | 3 +- nextflow_schema.json | 5 ++- subworkflows/local/align_graphmap2.nf | 2 +- subworkflows/local/bam_sort_index_samtools.nf | 32 ++++++++++----- subworkflows/local/bam_sort_samtools.nf | 40 ------------------- subworkflows/local/sv_sniffles.nf | 5 ++- subworkflows/local/vc_medaka.nf | 14 +++---- workflows/.Rhistory | 0 workflows/nanoseq.nf | 31 +++++--------- 11 files changed, 51 insertions(+), 86 deletions(-) delete mode 100644 subworkflows/local/bam_sort_samtools.nf create mode 100644 workflows/.Rhistory diff --git a/modules/local/medaka_variant.nf b/modules/local/medaka_variant.nf index 89009664..38f32d1b 100644 --- a/modules/local/medaka_variant.nf +++ b/modules/local/medaka_variant.nf @@ -19,7 +19,7 @@ process MEDAKA { } input: - tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) // + tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) // path(fasta) output: diff --git a/modules/local/samtools_sort_index.nf b/modules/local/samtools_sort_index.nf index cd625e23..f16c2906 100644 --- a/modules/local/samtools_sort_index.nf +++ b/modules/local/samtools_sort_index.nf @@ -38,4 +38,5 @@ process SAMTOOLS_SORT_INDEX { ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ -} \ No newline at end of file +} + diff --git a/modules/local/sniffles.nf b/modules/local/sniffles.nf index c07e3603..317eede5 100644 --- a/modules/local/sniffles.nf +++ b/modules/local/sniffles.nf @@ -39,4 +39,5 @@ process SNIFFLES { ${getSoftwareName(task.process)}: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") END_VERSIONS """ -} \ No newline at end of file +} + diff --git a/nextflow_schema.json b/nextflow_schema.json index bc80f2fe..516b2c01 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -499,6 +499,9 @@ { "$ref": "#/definitions/alignment_options" }, + { + "$ref": "#/definitions/variant_calling_options" + }, { "$ref": "#/definitions/differential_analysis_options" }, @@ -518,4 +521,4 @@ "$ref": "#/definitions/generic_options" } ] -} \ No newline at end of file +} diff --git a/subworkflows/local/align_graphmap2.nf b/subworkflows/local/align_graphmap2.nf index 7e736e00..6723214e 100644 --- a/subworkflows/local/align_graphmap2.nf +++ b/subworkflows/local/align_graphmap2.nf @@ -28,7 +28,7 @@ workflow ALIGN_GRAPHMAP2 { .collate(13) .map { it -> [ it[6], it[7], it[0], it[1], it[2], it[3], it[10], it[4] ] } // [ sample, fastq, fasta, sizes, gtf, bed, is_transcripts, index ] .set { ch_index } - + /* * Map reads with GRAPHMAP2 */ diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index 75e50bee..c7ecc2b5 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -4,25 +4,37 @@ params.options = [:] -include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' addParams( options: params.options ) +include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' addParams( options: params.options ) +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams( options: params.options ) +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.options ) include { SAMTOOLS_SORT_INDEX } from '../../modules/local/samtools_sort_index' addParams( options: params.options ) -include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' addParams( options: params.options ) +include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' addParams( options: params.options ) workflow BAM_SORT_INDEX_SAMTOOLS { take: ch_sam // channel: [ val(meta), [ bam ] ] + call_variants main: SAMTOOLS_VIEW_BAM ( ch_sam ) + if ( call_variants ) { + SAMTOOLS_SORT_INDEX ( SAMTOOLS_VIEW_BAM.out.bam ) + ch_sam + .join( SAMTOOLS_SORT_INDEX.out.bam_bai ) + .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } + .set { sortbam } + BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT_INDEX.out.bam_bai ) + } else{ + SAMTOOLS_SORT ( SAMTOOLS_VIEW_BAM.out.bam ) + SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) + ch_sam + .join( SAMTOOLS_SORT.out.bam ) + .join( SAMTOOLS_INDEX.out.bai ) + .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } + .set { sortbam } + BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]) ) + } - SAMTOOLS_SORT_INDEX( SAMTOOLS_VIEW_BAM.out.bam ) - - ch_sam - .join( SAMTOOLS_SORT_INDEX.out.bam_bai ) - .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } - .set { sortbam } - - BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT_INDEX.out.bam_bai ) BAM_STATS_SAMTOOLS.out.stats .join ( BAM_STATS_SAMTOOLS.out.idxstats ) .join ( BAM_STATS_SAMTOOLS.out.flagstat ) diff --git a/subworkflows/local/bam_sort_samtools.nf b/subworkflows/local/bam_sort_samtools.nf deleted file mode 100644 index 83c2d059..00000000 --- a/subworkflows/local/bam_sort_samtools.nf +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Sort, index BAM file and run samtools stats, flagstat and idxstats - */ - -params.options = [:] - -include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' addParams( options: params.options ) -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams( options: params.options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.options ) -include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' addParams( options: params.options ) - -workflow BAM_SORT_SAMTOOLS { - take: - ch_sam // channel: [ val(meta), [ bam ] ] - - main: - SAMTOOLS_VIEW_BAM ( ch_sam ) - - SAMTOOLS_SORT ( SAMTOOLS_VIEW_BAM.out.bam ) - SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) - - ch_sam - .join( SAMTOOLS_SORT.out.bam ) - .join( SAMTOOLS_INDEX.out.bai ) - .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } - .set { sortbam } - - BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]) ) - BAM_STATS_SAMTOOLS.out.stats - .join ( BAM_STATS_SAMTOOLS.out.idxstats ) - .join ( BAM_STATS_SAMTOOLS.out.flagstat ) - .map { it -> [ it[1], it[2], it[3] ] } - .set { sortbam_stats_multiqc } - versions = BAM_STATS_SAMTOOLS.out.versions - - emit: - sortbam - sortbam_stats_multiqc - versions -} diff --git a/subworkflows/local/sv_sniffles.nf b/subworkflows/local/sv_sniffles.nf index ab32e66f..9f29cb45 100644 --- a/subworkflows/local/sv_sniffles.nf +++ b/subworkflows/local/sv_sniffles.nf @@ -8,7 +8,7 @@ include { SNIFFLES } from '../../modules/local/sniffles' a workflow SV_SNIFFLES { take: - ch_view_sortbam + ch_view_sortbam main: /* @@ -20,4 +20,5 @@ workflow SV_SNIFFLES { emit: ch_sv_calls -} \ No newline at end of file +} + diff --git a/subworkflows/local/vc_medaka.nf b/subworkflows/local/vc_medaka.nf index 3918162a..742f3568 100644 --- a/subworkflows/local/vc_medaka.nf +++ b/subworkflows/local/vc_medaka.nf @@ -8,20 +8,20 @@ include { MEDAKA } from '../../modules/local/medaka_variant' workflow VC_MEDAKA { take: - ch_view_sortbam // - ch_index // + ch_view_sortbam // + ch_index // main: /* * Split into a different channel for each chromosome */ - // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling + // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling //SPLIT_CHROM( ch_view_sortbam ) //.splitCsv() //.combine( ch_view_sortbam ) // //.unique() //.map { it -> [ it[1], it[4], it[5], it[0] ] } // - //.map{ meta, bam, bai, chrom -> + //.map{ meta, bam, bai, chrom -> //new_meta = meta.clone() //new_meta.chrom = chrom //[new_meta, bam, bai] @@ -29,14 +29,14 @@ workflow VC_MEDAKA { /* * Call variants with MEDAKA - */ + */ MEDAKA( ch_view_sortbam, ch_index ) ch_variant_calls = MEDAKA.out.variant_calls // TODO Add module to concatenate variant calls back togehter and index - + emit: ch_variant_calls -} \ No newline at end of file +} diff --git a/workflows/.Rhistory b/workflows/.Rhistory new file mode 100644 index 00000000..e69de29b diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 3d20555d..def70ac5 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -140,7 +140,6 @@ include { INPUT_CHECK } from '../subworkflows/local/input_c include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( genome_options: genome_options ) include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options ) include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options ) -include { BAM_SORT_SAMTOOLS } from '../subworkflows/local/bam_sort_samtools' addParams( samtools_options: samtools_sort_options ) include { BAM_SORT_INDEX_SAMTOOLS } from '../subworkflows/local/bam_sort_index_samtools' addParams( samtools_options: samtools_sort_options ) include { VC_MEDAKA } from '../subworkflows/local/vc_medaka' addParams( medaka_vc_options: medaka_vc_options ) include { SV_SNIFFLES } from '../subworkflows/local/sv_sniffles' addParams( sniffles_sv_options: sniffles_sv_options ) @@ -327,27 +326,15 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.graphmap2_version.first().ifEmpty(null)) } - if (params.call_variants) { - /* - * SUBWORKFLOW: View, then sort, and index bam files using one module - */ - BAM_SORT_INDEX_SAMTOOLS ( ch_align_sam ) - ch_view_sortbam = BAM_SORT_INDEX_SAMTOOLS.out.sortbam - ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.versions.first().ifEmpty(null)) - ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - } else { - - /* - * SUBWORKFLOW: View, then sort and index bam files using two modules - */ - BAM_SORT_SAMTOOLS ( ch_align_sam ) - ch_view_sortbam = BAM_SORT_SAMTOOLS.out.sortbam - ch_software_versions = ch_software_versions.mix(BAM_SORT_SAMTOOLS.out.versions.first().ifEmpty(null)) - ch_samtools_multiqc = BAM_SORT_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - } - + /* + * SUBWORKFLOW: View, then sort, and index bam files + */ + BAM_SORT_INDEX_SAMTOOLS ( ch_align_sam, params.call_variants ) + ch_view_sortbam = BAM_SORT_INDEX_SAMTOOLS.out.sortbam + ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.versions.first().ifEmpty(null)) + ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - if (params.call_variants && params.protocol == 'DNA') { + if (params.call_variants && params.protocol == 'DNA') { /* * SUBWORKFLOW: Call variants with medaka */ @@ -356,7 +343,7 @@ workflow NANOSEQ{ ch_medaka_vc = VC_MEDAKA.out.ch_variant_calls } - if (params.call_variants && params.protocol == 'DNA') { + if (params.call_variants && params.protocol == 'DNA') { /* * SUBWORKFLOW: Call structural variants with sniffles */ From e5385c2892652b5ca07c3c40551bc68a26a916b1 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 13 Dec 2021 21:08:06 +0800 Subject: [PATCH 009/169] add vc check to GitHub Action --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cb96db4c..d21b0f19 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: NXF_ANSI_LOG: false strategy: matrix: - profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx, test_nobc_nodx_noaln] + profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx_vc, test_nobc_nodx, test_nobc_nodx_noaln] steps: - name: Check out pipeline code uses: actions/checkout@v2 From 1c89788e5b6b7f66b60bd2ae626749613e533461 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 14 Dec 2021 16:42:37 +0000 Subject: [PATCH 010/169] Template update for nf-core/tools version 2.2 --- .gitattributes | 2 + .github/CONTRIBUTING.md | 38 ++------ .github/ISSUE_TEMPLATE/bug_report.md | 63 ------------- .github/ISSUE_TEMPLATE/bug_report.yml | 52 ++++++++++ .github/ISSUE_TEMPLATE/config.yml | 1 - .github/ISSUE_TEMPLATE/feature_request.md | 32 ------- .github/ISSUE_TEMPLATE/feature_request.yml | 11 +++ .github/workflows/awsfulltest.yml | 8 +- .github/workflows/awstest.yml | 10 +- .github/workflows/ci.yml | 23 +++-- .github/workflows/linting_comment.yml | 1 + CHANGELOG.md | 2 +- CITATIONS.md | 2 +- LICENSE | 2 +- README.md | 15 +-- assets/multiqc_config.yaml | 2 +- assets/nf-core-nanoseq_logo.png | Bin 18337 -> 0 bytes assets/nf-core-nanoseq_logo_light.png | 11 +++ assets/sendmail_template.txt | 4 +- bin/scrape_software_versions.py | 36 ------- conf/base.config | 3 + conf/modules.config | 55 ++++++----- conf/test.config | 4 +- docs/images/nf-core-nanoseq_logo.png | Bin 35189 -> 0 bytes docs/images/nf-core-nanoseq_logo_dark.png | 9 ++ docs/images/nf-core-nanoseq_logo_light.png | 13 +++ docs/output.md | 2 +- docs/usage.md | 36 ------- lib/NfcoreSchema.groovy | 26 +++-- lib/NfcoreTemplate.groovy | 30 ++---- lib/Utils.groovy | 7 -- lib/WorkflowMain.groovy | 6 +- modules.json | 9 +- modules/local/functions.nf | 68 ------------- modules/local/get_software_versions.nf | 33 ------- modules/local/samplesheet_check.nf | 24 ++--- .../custom/dumpsoftwareversions/main.nf | 21 +++++ .../custom/dumpsoftwareversions/meta.yml | 34 +++++++ .../templates/dumpsoftwareversions.py | 89 ++++++++++++++++++ modules/nf-core/modules/fastqc/functions.nf | 68 ------------- modules/nf-core/modules/fastqc/main.nf | 39 ++++---- modules/nf-core/modules/fastqc/meta.yml | 7 +- modules/nf-core/modules/multiqc/functions.nf | 68 ------------- modules/nf-core/modules/multiqc/main.nf | 31 +++--- modules/nf-core/modules/multiqc/meta.yml | 7 +- nextflow.config | 35 +++---- nextflow_schema.json | 29 ------ subworkflows/local/input_check.nf | 8 +- workflows/nanoseq.nf | 44 +++------ 49 files changed, 446 insertions(+), 674 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100644 assets/nf-core-nanoseq_logo.png create mode 100644 assets/nf-core-nanoseq_logo_light.png delete mode 100755 bin/scrape_software_versions.py delete mode 100644 docs/images/nf-core-nanoseq_logo.png create mode 100644 docs/images/nf-core-nanoseq_logo_dark.png create mode 100644 docs/images/nf-core-nanoseq_logo_light.png delete mode 100644 modules/local/functions.nf delete mode 100644 modules/local/get_software_versions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/main.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/modules/fastqc/functions.nf delete mode 100644 modules/nf-core/modules/multiqc/functions.nf diff --git a/.gitattributes b/.gitattributes index 7fe55006..050bb120 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.config linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e102ae29..cdbebfc6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -68,16 +68,13 @@ If you wish to contribute a new step, please use the following coding standards: 1. Define the corresponding input channel into your new process from the expected previous process channel 2. Write the process block (see below). 3. Define the output channel if needed (see below). -4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). -6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). -7. Add sanity checks for all relevant parameters. -8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yml`. -11. If applicable add a [MultiQC](https://https://multiqc.info/) module. -12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +4. Add any new parameters to `nextflow.config` with a default (see below). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). +6. Add sanity checks and validation for all relevant parameters. +7. Perform local tests to validate that the new code works as expected. +8. If applicable, add a new test command in `.github/workflow/ci.yml`. +9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -102,27 +99,6 @@ Please use the following naming schemes, to make it easy to understand what is g If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` -### Software version reporting - -If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. - -Add to the script block of the process, something like the following: - -```bash - --version &> v_.txt 2>&1 || true -``` - -or - -```bash - --help | head -n 1 &> v_.txt 2>&1 || true -``` - -You then need to edit the script `bin/scrape_software_versions.py` to: - -1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` -2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. - ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 21c75a55..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Bug report -about: Report something that is broken or incorrect -labels: bug ---- - - - -## Check Documentation - -I have checked the following places for your error: - -- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/nanoseq pipeline documentation](https://nf-co.re/nanoseq/usage) - -## Description of the bug - - - -## Steps to reproduce - -Steps to reproduce the behaviour: - -1. Command line: -2. See error: - -## Expected behaviour - - - -## Log files - -Have you provided the following extra information/files: - -- [ ] The command used to run the pipeline -- [ ] The `.nextflow.log` file - -## System - -- Hardware: -- Executor: -- OS: -- Version - -## Nextflow Installation - -- Version: - -## Container engine - -- Engine: -- version: - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..55e0a8a5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,52 @@ + +name: Bug report +description: Report something that is broken or incorrect +labels: bug +body: + + - type: markdown + attributes: + value: | + Before you post this issue, please check the documentation: + + - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) + - [nf-core/nanoseq pipeline documentation](https://nf-co.re/nanoseq/usage) + + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used to launch the pipeline and the output from your terminal. + render: console + placeholder: | + $ nextflow run ... + + Some output where something broke + + - type: textarea + id: files + attributes: + label: Relevant files + description: | + Please drag and drop the relevant files here. Create a `.zip` archive if the extension is not allowed. + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. + + - type: textarea + id: system + attributes: + label: System information + description: | + * Nextflow version _(eg. 21.10.3)_ + * Hardware _(eg. HPC, Desktop, Cloud)_ + * Executor _(eg. slurm, local, awsbatch)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + * Version of nf-core/nanoseq _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 904ded2b..74fd1b53 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index e7d6e675..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for the nf-core/nanoseq pipeline -labels: enhancement ---- - - - -## Is your feature request related to a problem? Please describe - - - - - -## Describe the solution you'd like - - - -## Describe alternatives you've considered - - - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..c75fe931 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,11 @@ +name: Feature request +description: Suggest an idea for the nf-core/nanoseq pipeline +labels: enhancement +body: + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index b98d8148..c306f9d2 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,14 +14,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -30,5 +30,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-${{ github.sha }}" } - profiles: '[ "test_full", "aws_tower" ]' - + profiles: test_full,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 8fb8b2b3..41c8eae2 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,18 +11,18 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/nanoseq/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-test-${{ github.sha }}" } - profiles: '[ "test", "aws_tower" ]' - + profiles: test,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a09f14e7..0b3fa161 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,8 +8,9 @@ on: release: types: [published] -# Uncomment if we need an edge release of Nextflow again -# env: NXF_EDGE: 1 +env: + NXF_ANSI_LOG: false + CAPSULE_LOG: none jobs: test: @@ -17,20 +18,26 @@ jobs: # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} runs-on: ubuntu-latest - env: - NXF_VER: ${{ matrix.nxf_ver }} - NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['21.04.0', ''] + # Nextflow versions + include: + # Test pipeline minimum Nextflow version + - NXF_VER: '21.10.3' + NXF_EDGE: '' + # Test latest edge release of Nextflow + - NXF_VER: '' + NXF_EDGE: '1' steps: - name: Check out pipeline code uses: actions/checkout@v2 - name: Install Nextflow env: - CAPSULE_LOG: none + NXF_VER: ${{ matrix.NXF_VER }} + # Uncomment only if the edge release is more recent than the latest stable release + # See https://github.com/nextflow-io/nextflow/issues/2467 + # NXF_EDGE: ${{ matrix.NXF_EDGE }} run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 90f03c6f..44d72994 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,6 +15,7 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml + workflow_conclusion: completed - name: Get PR number id: pr_number diff --git a/CHANGELOG.md b/CHANGELOG.md index f4cc0367..bbaaa186 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## v1.2.0dev - [date] +## v2.0.1 - [date] Initial release of nf-core/nanoseq, created with the [nf-core](https://nf-co.re/) template. diff --git a/CITATIONS.md b/CITATIONS.md index cab8b750..5cf99706 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,7 +12,7 @@ * [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) +* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools diff --git a/LICENSE b/LICENSE index 61980963..7e2ec471 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) Chelsea Sawyer +Copyright (c) Chelsea Sawyer, Yuk Kei Wan Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 70f41dbb..fb1e71cd 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,11 @@ -# ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo.png) +# ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/nanoseq/results) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) @@ -33,18 +33,21 @@ On release, automated continuous integration tests run the pipeline on a full-si ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/nanoseq -profile test, + nextflow run nf-core/nanoseq -profile test,YOURPROFILE ``` + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + + > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! @@ -61,7 +64,7 @@ The nf-core/nanoseq pipeline comes with documentation about the pipeline [usage] ## Credits -nf-core/nanoseq was originally written by Chelsea Sawyer. +nf-core/nanoseq was originally written by Chelsea Sawyer, Yuk Kei Wan. We thank the following people for their extensive assistance in the development of this pipeline: diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 35b33cc7..365f1651 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > This report has been generated by the nf-core/nanoseq analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: software_versions: order: -1000 diff --git a/assets/nf-core-nanoseq_logo.png b/assets/nf-core-nanoseq_logo.png deleted file mode 100644 index d6bad792a70273b98164676f0c7f44fb5b9930fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18337 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 Jl}H%+{Xe$uM)Cjv diff --git a/assets/nf-core-nanoseq_logo_light.png b/assets/nf-core-nanoseq_logo_light.png new file mode 100644 index 00000000..d46347c2 --- /dev/null +++ b/assets/nf-core-nanoseq_logo_light.png @@ -0,0 +1,11 @@ + + +503 Service Unavailable + +

Service Unavailable

+

The server is temporarily unable to service your +request due to maintenance downtime or capacity +problems. Please try again later.

+

Additionally, a 503 Service Unavailable +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index c13fd9d4..5047c306 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -12,9 +12,9 @@ $email_html Content-Type: image/png;name="nf-core-nanoseq_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="nf-core-nanoseq_logo.png" +Content-Disposition: inline; filename="nf-core-nanoseq_logo_light.png" -<% out << new File("$projectDir/assets/nf-core-nanoseq_logo.png"). +<% out << new File("$projectDir/assets/nf-core-nanoseq_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py deleted file mode 100755 index ffabc860..00000000 --- a/bin/scrape_software_versions.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] -for version_file in version_files: - - software = version_file.replace(".version.txt", "") - if software == "pipeline": - software = "nf-core/nanoseq" - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/nanoseq Software Versions' -section_href: 'https://github.com/nf-core/nanoseq' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-""" -) -for k, v in sorted(results.items()): - print("
{}
{}
".format(k, v)) -print("
") - -# Write out as tsv file: -with open("software_versions.tsv", "w") as f: - for k, v in sorted(results.items()): - f.write("{}\t{}\n".format(k, v)) diff --git a/conf/base.config b/conf/base.config index 0fb87f7a..54af876e 100644 --- a/conf/base.config +++ b/conf/base.config @@ -54,4 +54,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withName:CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false + } } diff --git a/conf/modules.config b/conf/modules.config index 0b1bfdec..a0506a4d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,32 +1,41 @@ /* ======================================================================================== - Config file for defining DSL2 per module options + Config file for defining DSL2 per module options and publishing paths ======================================================================================== Available keys to override module options: - args = Additional arguments appended to command in module. - args2 = Second set of arguments appended to command in module (multi-tool modules). - args3 = Third set of arguments appended to command in module (multi-tool modules). - publish_dir = Directory to publish results. - publish_by_meta = Groovy list of keys available in meta map to append as directories to "publish_dir" path - If publish_by_meta = true - Value of ${meta['id']} is appended as a directory to "publish_dir" path - If publish_by_meta = ['id', 'custompath'] - If "id" is in meta map and "custompath" isn't then "${meta['id']}/custompath/" - is appended as a directory to "publish_dir" path - If publish_by_meta = false / null - No directories are appended to "publish_dir" path - publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension - The value of "directory" is appended to the standard "publish_dir" path as defined above. - If publish_files = null (unspecified) - All files are published. - If publish_files = false - No files are published. - suffix = File name suffix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ -params { - modules { - 'fastqc' { - args = "--quiet" - } - 'multiqc' { - args = "" - } +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + withName: SAMPLESHEET_CHECK { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + + withName: FASTQC { + ext.args = '--quiet' } + + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + pattern: '*_versions.yml' + ] + } + } diff --git a/conf/test.config b/conf/test.config index 164707b9..9e6b35b3 100644 --- a/conf/test.config +++ b/conf/test.config @@ -16,8 +16,8 @@ params { // Limit resources so that this can run on GitHub Actions max_cpus = 2 - max_memory = 6.GB - max_time = 6.h + max_memory = '6.GB' + max_time = '6.h' // Input data // TODO nf-core: Specify the paths to your test data on nf-core/test-datasets diff --git a/docs/images/nf-core-nanoseq_logo.png b/docs/images/nf-core-nanoseq_logo.png deleted file mode 100644 index d71a24951fa9abcd9335b37a1198c9110023a7ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35189 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 z + + 508 Resource Limit Is Reached + +

Resource Limit Is Reached

+The website is temporarily unable to service your request as it exceeded resource limit. +Please try again later. + diff --git a/docs/images/nf-core-nanoseq_logo_light.png b/docs/images/nf-core-nanoseq_logo_light.png new file mode 100644 index 00000000..1993002f --- /dev/null +++ b/docs/images/nf-core-nanoseq_logo_light.png @@ -0,0 +1,13 @@ + + +507 Insufficient Storage + +

Insufficient Storage

+

The method could not be performed on the resource +because the server is unable to store the +representation needed to successfully complete the +request. There is insufficient free space left in +your storage allocation.

+

Additionally, a 507 Insufficient Storage +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/docs/output.md b/docs/output.md index 5cc468fa..35335b2d 100644 --- a/docs/output.md +++ b/docs/output.md @@ -60,7 +60,7 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ * `pipeline_info/` * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.tsv`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. diff --git a/docs/usage.md b/docs/usage.md index 2efa8bde..415a66d0 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -181,42 +181,6 @@ process { > **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. -### Tool-specific options - -For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. - -The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: - -* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. - -* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. - -The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. - -When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. - -As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. - -Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. - -As you will see in the example below, we have: - -* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. -* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. -* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. - -```nextflow -params { - modules { - 'star_align' { - args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" - publish_dir = "my_star_directory" - publish_files = ['out':'log', 'tab':'log', 'bam':''] - } - } -} -``` - ### Updating containers The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 8d6920dd..40ab65f2 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -155,7 +159,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } @@ -202,7 +206,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -260,13 +264,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -330,7 +333,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log) { + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -346,11 +349,20 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - log.error "* --${param}: ${ex_json['message']} (${param_val})" + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } } } for (ex in causingExceptions) { - printExceptions(ex, params_json, log) + printExceptions(ex, params_json, log, enums) } } diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 44551e0a..2fc0a9b9 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,27 +19,16 @@ class NfcoreTemplate { } // - // Check params.hostnames + // Warn if a -profile or Nextflow config has not been provided to run the pipeline // - public static void hostName(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (params.hostnames) { - try { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } catch (Exception e) { - log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." - } + public static void checkConfigProvided(workflow, log) { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " } } @@ -168,7 +157,6 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { - hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 18173e98..1b88aec0 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -37,11 +37,4 @@ class Utils { "===================================================================================" } } - - // - // Join module args with appropriate spacing - // - public static String joinModuleArgs(args_list) { - return ' ' + args_list.join(' ') - } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index ce0c6989..9ad8f1ae 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -61,6 +61,9 @@ class WorkflowMain { // Print parameter summary log to screen log.info paramsSummaryLog(workflow, params, log) + // Check that a -profile or Nextflow config has been provided to run the pipeline + NfcoreTemplate.checkConfigProvided(workflow, log) + // Check that conda channels are set-up correctly if (params.enable_conda) { Utils.checkCondaChannels(log) @@ -69,9 +72,6 @@ class WorkflowMain { // Check AWS batch settings NfcoreTemplate.awsBatch(workflow, params) - // Check the hostnames against configured profiles - NfcoreTemplate.hostName(workflow, params, log) - // Check input has been provided if (!params.input) { log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" diff --git a/modules.json b/modules.json index 213de2cd..8d08e6bb 100644 --- a/modules.json +++ b/modules.json @@ -3,12 +3,15 @@ "homePage": "https://github.com/nf-core/nanoseq", "repos": { "nf-core/modules": { + "custom/dumpsoftwareversions": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + }, "fastqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" }, "multiqc": { - "git_sha": "e937c7950af70930d1f34bb961403d9d2aa81c7d" + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } -} +} \ No newline at end of file diff --git a/modules/local/functions.nf b/modules/local/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/local/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf deleted file mode 100644 index 019d496e..00000000 --- a/modules/local/get_software_versions.nf +++ /dev/null @@ -1,33 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - -process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } - - cache false - - input: - path versions - - output: - path "software_versions.tsv" , emit: tsv - path 'software_versions_mqc.yaml', emit: yaml - - script: // This script is bundled with the pipeline, in nf-core/nanoseq/bin/ - """ - echo $workflow.manifest.version > pipeline.version.txt - echo $workflow.nextflow.version > nextflow.version.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 8d74185d..9aaecf0c 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,31 +1,27 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'quay.io/biocontainers/python:3.8.3' }" input: path samplesheet output: - path '*.csv' + path '*.csv' , emit: csv + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/nanoseq/bin/ """ check_samplesheet.py \\ $samplesheet \\ samplesheet.valid.csv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf new file mode 100644 index 00000000..934bb467 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -0,0 +1,21 @@ +process CUSTOM_DUMPSOFTWAREVERSIONS { + label 'process_low' + + // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container + conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + + input: + path versions + + output: + path "software_versions.yml" , emit: yml + path "software_versions_mqc.yml", emit: mqc_yml + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml new file mode 100644 index 00000000..5b5b8a60 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -0,0 +1,34 @@ +name: custom_dumpsoftwareversions +description: Custom module used to dump software versions within the nf-core pipeline template +keywords: + - custom + - version +tools: + - custom: + description: Custom module used to dump software versions within the nf-core pipeline template + homepage: https://github.com/nf-core/tools + documentation: https://github.com/nf-core/tools + licence: ['MIT'] +input: + - versions: + type: file + description: YML file containing software versions + pattern: "*.yml" + +output: + - yml: + type: file + description: Standard YML file containing software versions + pattern: "software_versions.yml" + - mqc_yml: + type: file + description: MultiQC custom content YML file containing software versions + pattern: "software_versions_mqc.yml" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + +authors: + - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100644 index 00000000..d1390392 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + html = [ + dedent( + """\\ + + + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + +versions_this_module = {} +versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, +} + +with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + +# aggregate versions by the module name (derived from fully-qualified process name) +versions_by_module = {} +for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + +versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", +} + +versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), +} + +with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) +with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + +with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/fastqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 39c327b2..d250eca0 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - } else { - container "quay.io/biocontainers/fastqc:0.11.9--0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : + 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: tuple val(meta), path(reads) @@ -24,24 +13,32 @@ process FASTQC { output: tuple val(meta), path("*.html"), emit: html tuple val(meta), path("*.zip") , emit: zip - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 8eb9953d..b09553a3 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -15,6 +15,7 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ['GPL-2.0-only'] input: - meta: type: map @@ -40,10 +41,10 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/multiqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index da780800..3dceb162 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process MULTIQC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" - } else { - container "quay.io/biocontainers/multiqc:1.10.1--py_0" - } + conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path multiqc_files @@ -24,12 +13,16 @@ process MULTIQC { path "*multiqc_report.html", emit: report path "*_data" , emit: data path "*_plots" , optional:true, emit: plots - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) + def args = task.ext.args ?: '' """ - multiqc -f $options.args . - multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt + multiqc -f $args . + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + END_VERSIONS """ } diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 532a8bb1..63c75a45 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -11,6 +11,7 @@ tools: It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. homepage: https://multiqc.info/ documentation: https://multiqc.info/docs/ + licence: ['GPL-3.0-or-later'] input: - multiqc_files: type: file @@ -29,10 +30,10 @@ output: type: file description: Plots created by MultiQC pattern: "*_data" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@abhi18av" - "@bunop" diff --git a/nextflow.config b/nextflow.config index 94673293..138cea32 100644 --- a/nextflow.config +++ b/nextflow.config @@ -26,7 +26,6 @@ params { // Boilerplate options outdir = './results' tracedir = "${params.outdir}/pipeline_info" - publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -34,14 +33,12 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,modules' + schema_ignore_params = 'genomes' enable_conda = false - singularity_pull_docker_container = false // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - hostnames = [:] config_profile_description = null config_profile_contact = null config_profile_url = null @@ -58,9 +55,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -68,13 +62,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -126,11 +113,22 @@ profiles { test_full { includeConfig 'conf/test_full.config' } } +// Load igenomes.config if required +if (!params.igenomes_ignore) { + includeConfig 'conf/igenomes.config' +} else { + params.genomes = [:] +} + // Export these variables to prevent local Python/R libraries from conflicting with those in the container +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. + env { PYTHONNOUSERSITE = 1 R_PROFILE_USER = "/.Rprofile" R_ENVIRON_USER = "/.Renviron" + JULIA_DEPOT_PATH = "/usr/local/share/julia" } // Capture exit codes from upstream processes when piping @@ -156,14 +154,17 @@ dag { manifest { name = 'nf-core/nanoseq' - author = 'Chelsea Sawyer' + author = 'Chelsea Sawyer, Yuk Kei Wan' homePage = 'https://github.com/nf-core/nanoseq' description = 'A pipeline to demultiplex, QC and map Nanopore data' mainScript = 'main.nf' - nextflowVersion = '!>=21.04.0' - version = '1.2.0dev' + nextflowVersion = '!>=21.10.3' + version = '2.0.1' } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/nextflow_schema.json b/nextflow_schema.json index ce854282..0e2e2c61 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -104,12 +104,6 @@ "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", "fa_icon": "fas fa-users-cog" }, - "hostnames": { - "type": "string", - "description": "Institutional configs hostname.", - "hidden": true, - "fa_icon": "fas fa-users-cog" - }, "config_profile_name": { "type": "string", "description": "Institutional config name.", @@ -184,22 +178,6 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, - "publish_dir_mode": { - "type": "string", - "default": "copy", - "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" - ], - "hidden": true - }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", @@ -260,13 +238,6 @@ "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", "hidden": true, "fa_icon": "fas fa-bacon" - }, - "singularity_pull_docker_container": { - "type": "boolean", - "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", - "hidden": true, - "fa_icon": "fas fa-toolbox", - "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index b664bc8c..cddcbb3c 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -2,9 +2,7 @@ // Check input samplesheet and get read channels // -params.options = [:] - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: @@ -12,12 +10,14 @@ workflow INPUT_CHECK { main: SAMPLESHEET_CHECK ( samplesheet ) + .csv .splitCsv ( header:true, sep:',' ) .map { create_fastq_channels(it) } .set { reads } emit: - reads // channel: [ val(meta), [ reads ] ] + reads // channel: [ val(meta), [ reads ] ] + versions = SAMPLESHEET_CHECK.out.versions // channel: [ versions.yml ] } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index f4252991..45698688 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -32,18 +32,10 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi ======================================================================================== */ -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() - -// -// MODULE: Local to the pipeline -// -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['tsv':'']] ) - // // SUBWORKFLOW: Consisting of a mix of local and nf-core/modules // -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { INPUT_CHECK } from '../subworkflows/local/input_check' /* ======================================================================================== @@ -51,14 +43,12 @@ include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( opti ======================================================================================== */ -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? Utils.joinModuleArgs(["--title \"$params.multiqc_title\""]) : '' - // // MODULE: Installed directly from nf-core/modules // -include { FASTQC } from '../modules/nf-core/modules/fastqc/main' addParams( options: modules['fastqc'] ) -include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' addParams( options: multiqc_options ) +include { FASTQC } from '../modules/nf-core/modules/fastqc/main' +include { MULTIQC } from '../modules/nf-core/modules/multiqc/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* ======================================================================================== @@ -71,7 +61,7 @@ def multiqc_report = [] workflow NANOSEQ { - ch_software_versions = Channel.empty() + ch_versions = Channel.empty() // // SUBWORKFLOW: Read in samplesheet, validate and stage input files @@ -79,6 +69,7 @@ workflow NANOSEQ { INPUT_CHECK ( ch_input ) + ch_versions = ch_versions.mix(INPUT_CHECK.out.versions) // // MODULE: Run FastQC @@ -86,21 +77,10 @@ workflow NANOSEQ { FASTQC ( INPUT_CHECK.out.reads ) - ch_software_versions = ch_software_versions.mix(FASTQC.out.version.first().ifEmpty(null)) + ch_versions = ch_versions.mix(FASTQC.out.versions.first()) - // - // MODULE: Pipeline reporting - // - ch_software_versions - .map { it -> if (it) [ it.baseName, it ] } - .groupTuple() - .map { it[1][0] } - .flatten() - .collect() - .set { ch_software_versions } - - GET_SOFTWARE_VERSIONS ( - ch_software_versions.map { it }.collect() + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_versions.unique().collectFile(name: 'collated_versions.yml') ) // @@ -113,14 +93,14 @@ workflow NANOSEQ { ch_multiqc_files = ch_multiqc_files.mix(Channel.from(ch_multiqc_config)) ch_multiqc_files = ch_multiqc_files.mix(ch_multiqc_custom_config.collect().ifEmpty([])) ch_multiqc_files = ch_multiqc_files.mix(ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml')) - ch_multiqc_files = ch_multiqc_files.mix(GET_SOFTWARE_VERSIONS.out.yaml.collect()) + ch_multiqc_files = ch_multiqc_files.mix(CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect()) ch_multiqc_files = ch_multiqc_files.mix(FASTQC.out.zip.collect{it[1]}.ifEmpty([])) MULTIQC ( ch_multiqc_files.collect() ) - multiqc_report = MULTIQC.out.report.toList() - ch_software_versions = ch_software_versions.mix(MULTIQC.out.version.ifEmpty(null)) + multiqc_report = MULTIQC.out.report.toList() + ch_versions = ch_versions.mix(MULTIQC.out.versions) } /* From c8a574c62efc3fe0a42bb302a8c3937ce3349bde Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 15 Dec 2021 14:48:39 +0100 Subject: [PATCH 011/169] Moved variant calling into one workflow --- nextflow.config | 4 +- nextflow_schema.json | 18 ++++++-- subworkflows/local/dna_variant_calling.nf | 56 +++++++++++++++++++++++ workflows/nanoseq.nf | 18 ++------ 4 files changed, 77 insertions(+), 19 deletions(-) create mode 100644 subworkflows/local/dna_variant_calling.nf diff --git a/nextflow.config b/nextflow.config index be766fbc..26d0188f 100644 --- a/nextflow.config +++ b/nextflow.config @@ -41,10 +41,12 @@ params { save_align_intermeds = false skip_alignment = false - // Options: Variant calling + // Options: DNA variant calling call_variants = false split_mnps = false phase_vcf = false + skip_medaka = false + skip_sniffles = false // Options: Visualisation skip_bigbed = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 516b2c01..eca6b164 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -187,9 +187,9 @@ } } }, - "variant_calling_options": { - "title": "Variant calling options", - "description": "Options to adjust pameters and filtering criteria for varinat calling.", + "dna_variant_calling_options": { + "title": "DNA variant calling options", + "description": "Options to adjust pameters and filtering criteria for DNA varinat calling.", "default": "", "fa_icon": "fas fa-align-center", "properties": { @@ -207,6 +207,16 @@ "type": "boolean", "fa_icon": "fas fa-exchange-alt", "description": "Specifies if vcf will be phased." + }, + "skip_medaka": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip variant calling with sniffles." + }, + "skip_sniffles": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip variant calling with sniffles." } } }, @@ -500,7 +510,7 @@ "$ref": "#/definitions/alignment_options" }, { - "$ref": "#/definitions/variant_calling_options" + "$ref": "#/definitions/dna_variant_calling_options" }, { "$ref": "#/definitions/differential_analysis_options" diff --git a/subworkflows/local/dna_variant_calling.nf b/subworkflows/local/dna_variant_calling.nf new file mode 100644 index 00000000..91d42241 --- /dev/null +++ b/subworkflows/local/dna_variant_calling.nf @@ -0,0 +1,56 @@ +/* + * DNA variant calling + */ +params.medaka_vc_options = [:] +params.sniffles_sv_options = [:] + +include { MEDAKA } from '../../modules/local/medaka_variant' addParams( options: params.medaka_vc_options ) +include { SNIFFLES } from '../../modules/local/sniffles' addParams( options: params.sniffles_sv_options ) + +workflow DNA_VARIANT_CALLING { + + main: + take: + ch_view_sortbam + ch_index + skip_medaka + skip_sniffles + + main: + ch_variant_calls = Channel.empty() + if (!skip_medaka){ + /* + * Split into a different channel for each chromosome + */ + // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling + //SPLIT_CHROM( ch_view_sortbam ) + //.splitCsv() + //.combine( ch_view_sortbam ) // + //.unique() + //.map { it -> [ it[1], it[4], it[5], it[0] ] } // + //.map{ meta, bam, bai, chrom -> + //new_meta = meta.clone() + //new_meta.chrom = chrom + //[new_meta, bam, bai] + //}.set{ch_bam_vc_chrom} + + /* + * Call variants with MEDAKA + */ + MEDAKA( ch_view_sortbam, ch_index ) + ch_variant_calls = MEDAKA.out.variant_calls + } + ch_sv_calls = Channel.empty() + if (!skip_sniffles){ + /* + * Call variants with SNIFFLES + */ + SNIFFLES( ch_view_sortbam ) + ch_sv_calls = SNIFFLES.out.sv_calls + } else{ + } + + emit: + ch_variant_calls + ch_sv_calls +} \ No newline at end of file diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index def70ac5..6b91b545 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -141,8 +141,7 @@ include { PREPARE_GENOME } from '../subworkflows/local/prepare include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options ) include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options ) include { BAM_SORT_INDEX_SAMTOOLS } from '../subworkflows/local/bam_sort_index_samtools' addParams( samtools_options: samtools_sort_options ) -include { VC_MEDAKA } from '../subworkflows/local/vc_medaka' addParams( medaka_vc_options: medaka_vc_options ) -include { SV_SNIFFLES } from '../subworkflows/local/sv_sniffles' addParams( sniffles_sv_options: sniffles_sv_options ) +include { DNA_VARIANT_CALLING } from '../subworkflows/local/dna_variant_calling' addParams( medaka_vc_options: medaka_vc_options, sniffles_sv_options: sniffles_sv_options) include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtools_ucsc_bigwig' addParams( bigwig_options: bigwig_options ) include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' addParams( bigbed_options: bigbed_options ) include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' addParams( stringtie2_options: stringtie2_options, featurecounts_options: featurecounts_options ) @@ -334,22 +333,13 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.versions.first().ifEmpty(null)) ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - if (params.call_variants && params.protocol == 'DNA') { + if (params.call_variants && params.protocol == 'DNA') { /* - * SUBWORKFLOW: Call variants with medaka + * SUBWORKFLOW: DNA variant calling */ ch_medaka_version = Channel.empty() - VC_MEDAKA ( ch_view_sortbam, ch_index.map{ it [2] } ) - ch_medaka_vc = VC_MEDAKA.out.ch_variant_calls - } - - if (params.call_variants && params.protocol == 'DNA') { - /* - * SUBWORKFLOW: Call structural variants with sniffles - */ ch_sniffles_version = Channel.empty() - SV_SNIFFLES ( ch_view_sortbam ) - ch_sniffles_sv = SV_SNIFFLES.out.ch_sv_calls + DNA_VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] }, params.skip_medaka, params.skip_sniffles ) } ch_bedtools_version = Channel.empty() From dbcf7c61dfb696458b5057eacfa7d67e5b4c307b Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 15 Dec 2021 14:54:45 +0100 Subject: [PATCH 012/169] Fix linting errors --- subworkflows/local/dna_variant_calling.nf | 8 ++++---- workflows/nanoseq.nf | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/subworkflows/local/dna_variant_calling.nf b/subworkflows/local/dna_variant_calling.nf index 91d42241..3ad02329 100644 --- a/subworkflows/local/dna_variant_calling.nf +++ b/subworkflows/local/dna_variant_calling.nf @@ -22,13 +22,13 @@ workflow DNA_VARIANT_CALLING { /* * Split into a different channel for each chromosome */ - // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling + // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling //SPLIT_CHROM( ch_view_sortbam ) //.splitCsv() //.combine( ch_view_sortbam ) // //.unique() //.map { it -> [ it[1], it[4], it[5], it[0] ] } // - //.map{ meta, bam, bai, chrom -> + //.map{ meta, bam, bai, chrom -> //new_meta = meta.clone() //new_meta.chrom = chrom //[new_meta, bam, bai] @@ -36,7 +36,7 @@ workflow DNA_VARIANT_CALLING { /* * Call variants with MEDAKA - */ + */ MEDAKA( ch_view_sortbam, ch_index ) ch_variant_calls = MEDAKA.out.variant_calls } @@ -53,4 +53,4 @@ workflow DNA_VARIANT_CALLING { emit: ch_variant_calls ch_sv_calls -} \ No newline at end of file +} diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 6b91b545..3a49a654 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -333,7 +333,7 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.versions.first().ifEmpty(null)) ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - if (params.call_variants && params.protocol == 'DNA') { + if (params.call_variants && params.protocol == 'DNA') { /* * SUBWORKFLOW: DNA variant calling */ From 383f4662473c645a38f7e4e62e867da4f0f7a68c Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 15 Dec 2021 15:54:44 +0100 Subject: [PATCH 013/169] Add citations --- CITATIONS.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CITATIONS.md b/CITATIONS.md index 1927b766..697c7f3c 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -26,6 +26,8 @@ * [Minimap2](https://pubmed.ncbi.nlm.nih.gov/29750242/) > Li H. Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics. 2018 Sep 15;34(18):3094-3100. doi: 10.1093/bioinformatics/bty191. PMID: 29750242; PMCID: PMC6137996. +* [Medaka](https://github.com/nanoporetech/medaka) + * [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. @@ -43,6 +45,9 @@ * [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. +* [Sniffles](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5990442/) + > Sedlazeck FJ, Rescheneder P, Smolka M, Fang H, Nattestad M, von Haeseler A, Schatz MC. Accurate detection of complex structural variations using single-molecule sequencing. Nat Methods. 2018 Jun;15(6):461-468. doi: 10 1038/s41592-018-0001-7. Epub 2018 Apr 30. PMID: 29713083; PMCID: PMC5990442. + * [StringTie2](https://www.ncbi.nlm.nih.gov/pubmed/31842956/) > Kovaka S, Zimin AV, Pertea GM, Razaghi R, Salzberg SL, Pertea M. Transcriptome assembly from long-read RNA-seq alignments with StringTie2 Genome Biol. 2019 Dec 16;20(1):278. doi: 10.1186/s13059-019-1910-1. PubMed PMID: 31842956; PubMed Central PMCID: PMC6912988. From bd8901e303c8c75fe031da5a1948d68f505cb2ed Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Fri, 17 Dec 2021 00:19:28 +0800 Subject: [PATCH 014/169] Update nextflow_schema.json --- nextflow_schema.json | 36 +++++++----------------------------- 1 file changed, 7 insertions(+), 29 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index eca6b164..60dce87b 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -154,6 +154,7 @@ "fa_icon": "fas fa-fast-forward" }, "nanolyse_fasta": { + "type": "string", "description": "Fasta file to be filtered against using NanoLyse", "fa_icon": "far fa-file-code" } @@ -161,11 +162,13 @@ }, "alignment_options": { "title": "Alignment options", + "type": "object", "description": "Options to adjust parameters and filtering criteria for read alignments.", "default": "", "fa_icon": "fas fa-map-signs", "properties": { "aligner": { + "type": "string", "default": "minimap2", "description": "Specifies the aligner to use i.e. 'minimap2' or 'graphmap2'.", "fa_icon": "fas fa-align-center" @@ -182,6 +185,7 @@ "description": "Save the '.sam' files from the alignment step - not done by default." }, "skip_alignment": { + "type": "boolean", "description": "Skip alignment and downstream processes.", "fa_icon": "fas fa-fast-forward" } @@ -189,6 +193,7 @@ }, "dna_variant_calling_options": { "title": "DNA variant calling options", + "type": "object", "description": "Options to adjust pameters and filtering criteria for DNA varinat calling.", "default": "", "fa_icon": "fas fa-align-center", @@ -222,11 +227,13 @@ }, "differential_analysis_options": { "title": "Differential analysis options", + "type": "object", "description": "Options to adjust quantification and differential analysis", "default": "", "fa_icon": "fas fa-calculator", "properties": { "quantification_method": { + "type": "string", "default": "bambu", "description": "Specifies the transcript quantification method to use (available are: bambu or stringtie2). Only available when protocol is cDNA or directRNA.", "fa_icon": "fas fa-bezier-curve" @@ -332,12 +339,6 @@ "help_text": "If you're running offline, Nextflow will not be able to fetch the institutional config files from the internet. If you don't need them, then this is not a problem. If you do need them, you should download the files from the repo and tell Nextflow where to find them with this parameter.", "fa_icon": "fas fa-users-cog" }, - "hostnames": { - "type": "string", - "description": "Institutional configs hostname.", - "hidden": true, - "fa_icon": "fas fa-users-cog" - }, "config_profile_name": { "type": "string", "description": "Institutional config name.", @@ -412,22 +413,6 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, - "publish_dir_mode": { - "type": "string", - "default": "copy", - "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" - ], - "hidden": true - }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", @@ -488,13 +473,6 @@ "description": "Run this workflow with Conda. You can also use '-profile conda' instead of providing this parameter.", "hidden": true, "fa_icon": "fas fa-bacon" - }, - "singularity_pull_docker_container": { - "type": "boolean", - "description": "Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead.", - "hidden": true, - "fa_icon": "fas fa-toolbox", - "help_text": "This may be useful for example if you are unable to directly pull Singularity containers to run the pipeline due to http/https proxy issues." } } } From 9c0b127add838abfbc506b46c4f523894e737fd6 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 17 Dec 2021 09:33:32 +0800 Subject: [PATCH 015/169] new dsl2 syntax (things run locally) --- .github/CONTRIBUTING.md | 38 +- .github/ISSUE_TEMPLATE/bug_report.md | 63 --- .github/ISSUE_TEMPLATE/bug_report.yml | 52 +++ .github/ISSUE_TEMPLATE/config.yml | 1 - .github/ISSUE_TEMPLATE/feature_request.md | 32 -- .github/ISSUE_TEMPLATE/feature_request.yml | 11 + .github/workflows/awsfulltest.yml | 7 +- .github/workflows/awstest.yml | 12 +- .github/workflows/ci.yml | 29 +- .github/workflows/linting_comment.yml | 1 + README.md | 14 +- assets/multiqc_config.yaml | 2 +- assets/nf-core-nanoseq_logo.png | Bin 18337 -> 0 bytes assets/nf-core-nanoseq_logo_light.png | 11 + assets/sendmail_template.txt | 4 +- bin/markdown_to_html.py | 91 ---- bin/scrape_software_versions.py | 36 -- conf/base.config | 3 + conf/modules.config | 399 ++++++++++++++---- conf/test.config | 34 +- docs/images/nf-core-nanoseq_logo.png | Bin 35189 -> 0 bytes docs/images/nf-core-nanoseq_logo_dark.png | 9 + docs/images/nf-core-nanoseq_logo_light.png | 13 + docs/output.md | 7 +- docs/usage.md | 36 -- modules/local/bam_rename.nf | 12 +- modules/local/bambu.nf | 17 +- modules/local/bedtools_bamtobed.nf | 18 +- modules/local/bedtools_genomecov.nf | 18 +- modules/local/deseq2.nf | 20 +- modules/local/dexseq.nf | 21 +- modules/local/functions.nf | 75 ---- modules/local/get_chrom_sizes.nf | 23 +- modules/local/get_nanolyse_fasta.nf | 6 - modules/local/get_software_versions.nf | 33 -- modules/local/get_test_data.nf | 6 - modules/local/graphmap2_align.nf | 21 +- modules/local/graphmap2_index.nf | 21 +- modules/local/gtf2bed.nf | 21 +- modules/local/guppy.nf | 13 +- modules/local/medaka_variant.nf | 22 +- modules/local/minimap2_align.nf | 21 +- modules/local/minimap2_index.nf | 21 +- modules/local/multiqc.nf | 30 +- modules/local/nanoplot.nf | 41 ++ modules/local/qcat.nf | 21 +- modules/local/samplesheet_check.nf | 24 +- modules/local/samtools_sort_index.nf | 26 +- modules/local/samtools_view_bam.nf | 21 +- modules/local/sniffles.nf | 21 +- modules/local/stringtie2.nf | 21 +- modules/local/subread_featurecounts.nf | 21 +- modules/local/ucsc_bed12tobigbed.nf | 24 +- modules/local/ucsc_bedgraphtobigwig.nf | 24 +- .../custom/dumpsoftwareversions/functions.nf | 78 ---- .../custom/dumpsoftwareversions/main.nf | 95 +---- .../custom/dumpsoftwareversions/meta.yml | 1 + .../templates/dumpsoftwareversions.py | 89 ++++ modules/nf-core/modules/fastqc/functions.nf | 68 --- modules/nf-core/modules/fastqc/main.nf | 39 +- modules/nf-core/modules/fastqc/meta.yml | 7 +- modules/nf-core/modules/multiqc/functions.nf | 68 --- modules/nf-core/modules/multiqc/main.nf | 35 -- modules/nf-core/modules/multiqc/meta.yml | 39 -- modules/nf-core/modules/nanolyse/functions.nf | 78 ---- modules/nf-core/modules/nanolyse/main.nf | 26 +- modules/nf-core/modules/nanoplot/functions.nf | 78 ---- modules/nf-core/modules/nanoplot/main.nf | 51 --- modules/nf-core/modules/nanoplot/meta.yml | 59 --- modules/nf-core/modules/pycoqc/functions.nf | 78 ---- modules/nf-core/modules/pycoqc/main.nf | 26 +- .../modules/samtools/flagstat/functions.nf | 78 ---- .../nf-core/modules/samtools/flagstat/main.nf | 27 +- .../modules/samtools/flagstat/meta.yml | 24 +- .../modules/samtools/idxstats/functions.nf | 79 ---- .../nf-core/modules/samtools/idxstats/main.nf | 25 +- .../modules/samtools/idxstats/meta.yml | 24 +- .../modules/samtools/index/functions.nf | 78 ---- .../nf-core/modules/samtools/index/main.nf | 36 +- .../nf-core/modules/samtools/index/meta.yml | 33 +- .../modules/samtools/sort/functions.nf | 78 ---- modules/nf-core/modules/samtools/sort/main.nf | 29 +- .../nf-core/modules/samtools/sort/meta.yml | 24 +- .../modules/samtools/stats/functions.nf | 78 ---- .../nf-core/modules/samtools/stats/main.nf | 31 +- .../nf-core/modules/samtools/stats/meta.yml | 45 +- .../modules/stringtie/merge/functions.nf | 78 ---- .../nf-core/modules/stringtie/merge/main.nf | 24 +- nextflow.config | 41 +- subworkflows/local/align_graphmap2.nf | 8 +- subworkflows/local/align_minimap2.nf | 8 +- subworkflows/local/bam_sort_index_samtools.nf | 12 +- subworkflows/local/bedtools_ucsc_bigbed.nf | 6 +- subworkflows/local/bedtools_ucsc_bigwig.nf | 6 +- .../local/differential_deseq2_dexseq.nf | 8 +- subworkflows/local/dna_variant_calling.nf | 10 +- subworkflows/local/input_check.nf | 5 +- subworkflows/local/prepare_genome.nf | 6 +- .../qcbasecall_pycoqc_nanoplot.nf | 7 +- .../qcfastq_nanoplot_fastqc.nf | 7 +- .../local/quantify_stringtie_featurecounts.nf | 9 +- subworkflows/local/sv_sniffles.nf | 24 -- subworkflows/local/vc_medaka.nf | 42 -- subworkflows/nf-core/bam_stats_samtools.nf | 8 +- workflows/nanoseq.nf | 77 ++-- 105 files changed, 960 insertions(+), 2598 deletions(-) delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.yml delete mode 100644 assets/nf-core-nanoseq_logo.png create mode 100644 assets/nf-core-nanoseq_logo_light.png delete mode 100755 bin/markdown_to_html.py delete mode 100755 bin/scrape_software_versions.py delete mode 100644 docs/images/nf-core-nanoseq_logo.png create mode 100644 docs/images/nf-core-nanoseq_logo_dark.png create mode 100644 docs/images/nf-core-nanoseq_logo_light.png delete mode 100644 modules/local/functions.nf delete mode 100644 modules/local/get_software_versions.nf create mode 100644 modules/local/nanoplot.nf delete mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf create mode 100644 modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py delete mode 100644 modules/nf-core/modules/fastqc/functions.nf delete mode 100644 modules/nf-core/modules/multiqc/functions.nf delete mode 100644 modules/nf-core/modules/multiqc/main.nf delete mode 100644 modules/nf-core/modules/multiqc/meta.yml delete mode 100644 modules/nf-core/modules/nanolyse/functions.nf delete mode 100644 modules/nf-core/modules/nanoplot/functions.nf delete mode 100644 modules/nf-core/modules/nanoplot/main.nf delete mode 100644 modules/nf-core/modules/nanoplot/meta.yml delete mode 100644 modules/nf-core/modules/pycoqc/functions.nf delete mode 100644 modules/nf-core/modules/samtools/flagstat/functions.nf delete mode 100644 modules/nf-core/modules/samtools/idxstats/functions.nf delete mode 100644 modules/nf-core/modules/samtools/index/functions.nf delete mode 100644 modules/nf-core/modules/samtools/sort/functions.nf delete mode 100644 modules/nf-core/modules/samtools/stats/functions.nf delete mode 100644 modules/nf-core/modules/stringtie/merge/functions.nf rename subworkflows/{nf-core => local}/qcbasecall_pycoqc_nanoplot.nf (83%) rename subworkflows/{nf-core => local}/qcfastq_nanoplot_fastqc.nf (86%) delete mode 100644 subworkflows/local/sv_sniffles.nf delete mode 100644 subworkflows/local/vc_medaka.nf diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index e102ae29..cdbebfc6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -68,16 +68,13 @@ If you wish to contribute a new step, please use the following coding standards: 1. Define the corresponding input channel into your new process from the expected previous process channel 2. Write the process block (see below). 3. Define the output channel if needed (see below). -4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build`). -6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). -7. Add sanity checks for all relevant parameters. -8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yml`. -11. If applicable add a [MultiQC](https://https://multiqc.info/) module. -12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +4. Add any new parameters to `nextflow.config` with a default (see below). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). +6. Add sanity checks and validation for all relevant parameters. +7. Perform local tests to validate that the new code works as expected. +8. If applicable, add a new test command in `.github/workflow/ci.yml`. +9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -102,27 +99,6 @@ Please use the following naming schemes, to make it easy to understand what is g If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` -### Software version reporting - -If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. - -Add to the script block of the process, something like the following: - -```bash - --version &> v_.txt 2>&1 || true -``` - -or - -```bash - --help | head -n 1 &> v_.txt 2>&1 || true -``` - -You then need to edit the script `bin/scrape_software_versions.py` to: - -1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` -2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. - ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 21c75a55..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,63 +0,0 @@ ---- -name: Bug report -about: Report something that is broken or incorrect -labels: bug ---- - - - -## Check Documentation - -I have checked the following places for your error: - -- [ ] [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) -- [ ] [nf-core/nanoseq pipeline documentation](https://nf-co.re/nanoseq/usage) - -## Description of the bug - - - -## Steps to reproduce - -Steps to reproduce the behaviour: - -1. Command line: -2. See error: - -## Expected behaviour - - - -## Log files - -Have you provided the following extra information/files: - -- [ ] The command used to run the pipeline -- [ ] The `.nextflow.log` file - -## System - -- Hardware: -- Executor: -- OS: -- Version - -## Nextflow Installation - -- Version: - -## Container engine - -- Engine: -- version: - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 00000000..55e0a8a5 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,52 @@ + +name: Bug report +description: Report something that is broken or incorrect +labels: bug +body: + + - type: markdown + attributes: + value: | + Before you post this issue, please check the documentation: + + - [nf-core website: troubleshooting](https://nf-co.re/usage/troubleshooting) + - [nf-core/nanoseq pipeline documentation](https://nf-co.re/nanoseq/usage) + + - type: textarea + id: description + attributes: + label: Description of the bug + description: A clear and concise description of what the bug is. + validations: + required: true + + - type: textarea + id: command_used + attributes: + label: Command used and terminal output + description: Steps to reproduce the behaviour. Please paste the command you used to launch the pipeline and the output from your terminal. + render: console + placeholder: | + $ nextflow run ... + + Some output where something broke + + - type: textarea + id: files + attributes: + label: Relevant files + description: | + Please drag and drop the relevant files here. Create a `.zip` archive if the extension is not allowed. + Your verbose log file `.nextflow.log` is often useful _(this is a hidden file in the directory where you launched the pipeline)_ as well as custom Nextflow configuration files. + + - type: textarea + id: system + attributes: + label: System information + description: | + * Nextflow version _(eg. 21.10.3)_ + * Hardware _(eg. HPC, Desktop, Cloud)_ + * Executor _(eg. slurm, local, awsbatch)_ + * Container engine: _(e.g. Docker, Singularity, Conda, Podman, Shifter or Charliecloud)_ + * OS _(eg. CentOS Linux, macOS, Linux Mint)_ + * Version of nf-core/nanoseq _(eg. 1.1, 1.5, 1.8.2)_ diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 904ded2b..74fd1b53 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index e7d6e675..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,32 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for the nf-core/nanoseq pipeline -labels: enhancement ---- - - - -## Is your feature request related to a problem? Please describe - - - - - -## Describe the solution you'd like - - - -## Describe alternatives you've considered - - - -## Additional context - - diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 00000000..c75fe931 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,11 @@ +name: Feature request +description: Suggest an idea for the nf-core/nanoseq pipeline +labels: enhancement +body: + - type: textarea + id: description + attributes: + label: Description of feature + description: Please describe your suggestion for a new feature. It might help to describe a problem or use case, plus any alternatives that you have considered. + validations: + required: true diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 164c35de..c306f9d2 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,14 +14,14 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master + uses: nf-core/tower-action@v2 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} @@ -30,4 +30,5 @@ jobs: { "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-${{ github.sha }}" } - profiles: '[ "test_full", "aws_tower" ]' + profiles: test_full,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 5253f88f..d3f7acac 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,19 +11,17 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@master - + uses: nf-core/tower-action@v2 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} - bearer_token: ${{ secrets.TOWER_BEARER_TOKEN }} + access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} pipeline: ${{ github.repository }} revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/nanoseq/work-${{ github.sha }} parameters: | { - "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-${{ github.sha }}" + "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-test-${{ github.sha }}" } - - profiles: '[ "test", "aws_tower" ]' - + profiles: test,aws_tower + pre_run_script: 'export NXF_VER=21.10.3' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index d21b0f19..f7ad3b29 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -8,8 +8,9 @@ on: release: types: [published] -# Uncomment if we need an edge release of Nextflow again -# env: NXF_EDGE: 1 +env: + NXF_ANSI_LOG: false + CAPSULE_LOG: none jobs: test: @@ -17,20 +18,26 @@ jobs: # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} runs-on: ubuntu-latest - env: - NXF_VER: ${{ matrix.nxf_ver }} - NXF_ANSI_LOG: false strategy: matrix: - # Nextflow versions: check pipeline minimum and current latest - nxf_ver: ['21.04.0', ''] + # Nextflow versions + include: + # Test pipeline minimum Nextflow version + - NXF_VER: '21.10.3' + NXF_EDGE: '' + # Test latest edge release of Nextflow + - NXF_VER: '' + NXF_EDGE: '1' steps: - name: Check out pipeline code uses: actions/checkout@v2 - name: Install Nextflow env: - CAPSULE_LOG: none + NXF_VER: ${{ matrix.NXF_VER }} + # Uncomment only if the edge release is more recent than the latest stable release + # See https://github.com/nextflow-io/nextflow/issues/2467 + # NXF_EDGE: ${{ matrix.NXF_EDGE }} run: | wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ @@ -44,7 +51,7 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} runs-on: ubuntu-latest env: - NXF_VER: '21.04.0' + NXF_VER: '21.10.3' NXF_ANSI_LOG: false strategy: matrix: @@ -69,7 +76,7 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} runs-on: ubuntu-latest env: - NXF_VER: '21.04.0' + NXF_VER: '21.10.3' NXF_ANSI_LOG: false strategy: matrix: @@ -94,7 +101,7 @@ jobs: if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} runs-on: ubuntu-latest env: - NXF_VER: '21.04.0' + NXF_VER: '21.10.3' NXF_ANSI_LOG: false strategy: matrix: diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 90f03c6f..44d72994 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,6 +15,7 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml + workflow_conclusion: completed - name: Get PR number id: pr_number diff --git a/README.md b/README.md index 44666d41..0de86232 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,12 @@ -# ![nfcore/nanoseq](docs/images/nf-core-nanoseq_logo.png) +# ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-Full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/nanoseq/results) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3697959-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.3697959) -[![Nextflow](https://img.shields.io/badge/nextflow-%E2%89%A521.04.0-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) [![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) [![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) [![Docker](https://img.shields.io/docker/automated/nfcore/nanoseq.svg)](https://hub.docker.com/r/nfcore/nanoseq) @@ -49,18 +50,21 @@ On release, automated continuous integration tests run the pipeline on a [full-s ## Quick Start -1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.04.0`) +1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) 2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/nanoseq -profile test, + nextflow run nf-core/nanoseq -profile test,YOURPROFILE ``` + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + + > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` then the pipeline will auto-detect this and attempt to download the Singularity images directly as opposed to performing a conversion from Docker images. If you are persistently observing issues downloading Singularity images directly due to timeout or network issues then please use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, it is highly recommended to use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to pre-download all of the required containers before running the pipeline and to set the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options to be able to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 35b33cc7..365f1651 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > This report has been generated by the nf-core/nanoseq analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: software_versions: order: -1000 diff --git a/assets/nf-core-nanoseq_logo.png b/assets/nf-core-nanoseq_logo.png deleted file mode 100644 index d6bad792a70273b98164676f0c7f44fb5b9930fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18337 zcmX|p1z40_*YywrA}Jvtjf8}NbV-MFiAsk`mvj!DQYz9d-O}A5ozgkd-8H~}#^?S1 z>p~renS0KCV(+!rT6;oOm1VIp$uJ=h2=;3^DRl@0DH=R3#y|sqr?NhO1pawwC->d~ z0>SA-{6UIk!FdXSP(xlziEFwh@1?l75>DQAFC|$2&iP6ykHM3H79#d6y)qp09i&uU zN>fUj)lmFFsq0xV<_{0)0G6=NY=%tCXUxoUJQCE77&HNRa=rnlR@H-7x8*Z~`=9y~ z2CFx(4hOgzXA%ysh7!0o2J$-|`iVh&VEhmW4XPs7AosW;*Pfz7H*!FmAqNQ-=VABP zP7LrI;ujj`#zo)2lW6`l$cy!G!$k9(gind)WP{gYh$mMbH`X1xd6510>SCFb_4Y>h zcEkn2n=VU2n>A3xcqh5_+!^1M8W&R=b z#rnvJODYoq<3`B8smbZGl)yM<|7*NeSh_mDrNIF=_Eg~`#zQL}-?F5oy+aAg`IDKfP9mU9P_M$^^bCy&?Z z@UhOnotnd8Gp6YUr9EY%Sx38mfgxXPm`OgUlk$4s z5<#e`sUa7N31R4I@eyL#zuvQTQjsdvBJ=iYz-JBNXl?%zIGoER29!Fr)rkE-)CHy4&2r+>@>wKjK>MB(M(RT4S< zOODDM>%EqiTRAbE+I4O7Uy)Q#x*p5)cp4n|Z+ zYnfV>*M3yZc}{4+I)}9ZfkZkZGBb}8)7!UM@;bOp)YNi0VwJR5F=48`{0}i`G|%Hd zU6&S#-d&nB1jMNr6S5XT~rUUW5ywWDMi_e86 z$f(O0NEqhxLZiHgXJ;IPl`Uox7~s7Dg>OsSiC-pQsR$oQRW!>&kCwCzSf2CVic)io zY}~nOfTPWGcT`&P^ptF1P&@GHwgvYakpbfCySE8Ult6jWZOv~pNzP$Q$_b%=_dw9qFyW$I+m zxqEt<^9_9SK`NOkNQ~t1Z!7CMUhCh(S=d`>;FF1>-1``%n=3vJsnW6@6WyIf_3~oW z{iC&7Uyn(Ys6Ao+G(C_~m>*T1Fho5d)Bh#rYok3*j$cC8L5vc8ugL>eTey?ZB`~fO zc1-wQtXk-4#7^+{^`)-2`fj-Ox<0S;8(M7xVPoUJv9lXAe^E-}{Wo^PXOBarxkB0D z^a1JOrCoK~63HdaUm6pQb&J`1&VuAM&37`0E6qmC)AI}c6*bVLb2)lTCk*@BsM1A- zvtDr$pFJE6ntB}$&mw!f-Dd~ymbPjz&I{~94Kguq$5T`w_nr2!YpFLFsx)V)k7=oY z_0G9Ojj!qg{~ZM`G7fnrvc!?%@j@+q4qy8RdCeWo>Gz(5g)iV3tuHyR`_DKBE7{Kq z-V~;5@imnv5s;FG=4<34n^`a%RYTor4VS9MFZYkd;rh9&{+YQd^L{Gp;UQu%G4+w(jdY1*|P*%8}(Znq}fiQeo9$?tU#J3n!AbEj+MDl@UM zRbAaYVsG@xR)}+-DP+J|>h03WeQ8&pnSR7x@+pFxkjM$6Sv8;__2I~a-_j{Uw67je zVYw2Dk3lwqZ%7ueXrOGzmf=PPKHN5c$d>JN<}{N6(IJjFVJ3m-{zlR=GC>RN9sG_{ zPw*gA8#X=uH%lE`Pvfv`rvs+F?oup~ooXKwLW#@pL|vf z308W>ElG`B!lT(HsBG1xy2P83NYP`+VU;ztQ|@{7xuIpr>tbPZzOG^_?YRWTkK`Gj zVFwqoyH@+bRF}6^tw;qUKA&U-gs33iEzZOT;MY^`Dn~n>L6c$wc~j=;e=J!opH}li zGCpTVHGY5up)YxwkQ`3A&eYgaMUo2`pYTP(4kt8Ju6`a~?)M#BuC@;krMXdAS+d^+ zWf8e~J5d!Mg{#bx;fFwC_5GhFYHM0psAU%i|JZ~egH7B1S6-@55S~yu3+^?>~NI{``qbL_{>Q<+#j`)7I7&5*jLQWyLBXDM=G6 zFS3dYnV6cQ6BVU$b8};Q@j~X~NBRj19t@i3{xu9792rkf;l~67quB~i0)qJ>J{^7X z+;SBB9viy?PAAjz=i=7ZY#<{OVm|Qm^TVT}iV6rom6DS3+0a>3E6^&m-x{O;`}gm1 zUo1;rL4lu4mai18xT-4NY_)ax{z5~R$HhK|1-vzeJ=IpWDhde&jao!xVP|-}DoCF7 zRXNVxEOyZoRM!3(KOXZFID=@}A9cu}O*LO-Bt~y3TifqG1%3@D(mEb#ro5)0&q~-6 z?#0q**8BVr)YmA{B;?^p_<9_|)$C)LUs=1=#si>AdVvJ7SHywRDJ4kMkiqbg-+jnT z&#HxbTq8S*N1K#hUD0~$WS+T;yyW64|JYBwyU_5&bU0Po$*F3Ak0wDeC_bL#baNEN z9}T>dLghYl|6r~7<`>ENy%aWIz zl2VmxgOjP}Lq8t^M&;#=G-&r?lSfQSO2pWhdN}FtKfNDbI&O_UfOSW7d{cQ9s+=Mi zifI6nLok(hYY_I+GU&ZGn0Em$1#E0=X?J(Q9Hpe7*WVb#GgNCGn@Tp}a8Ikb>cJ9Q zhxLK-%hSS|v75emioDT+yi^y17`Hvvp((Fel_+J@t7|5k zrZX+IJ8}_sLfhsmhHBd-oRpF^icl1EoX&psmM&995WPq!8c-W2{^}&t>m!-Y)_7386_;VJPj=h?tNa+2|66JGYh~dUi3W=~Q z2M&dxRLUz1nh}et%iW4$fE&Irrg=WjRY^Oa4v#KAC%^kClanW#ej^DO14)T)-706x zZeR;oQN>hYQXU>2%7+)1N3eKq^T*peJ37g!MOD-o@5+q>7s?ow5(B_uyNlcwK4AN0 ztLwOR#gIe8EhC(ihD1(wN~W97exeNz8BL|?RtWi+vHd_#7mCt9JaG^diq@%6#!F9m!?LGTt{@Zeg4{T;cxYgO~=p33Vq zX5lahi`1{Ok~{6^{RvM53SM5CC5|=G=c3&S9F~U4j>K#OexNw~%z*#x7j%Cq=As z#8OF0XD5#2{0`M5C2z+`+-(Av>EU{kZTsAG*!`5ghmzw-f_lCbC@%1+sBlB2{C1{F zVeNsBCU`LEEdLa>&DS}MHn`X(-PtGaUCF1m3+ro@>PK`0<7%Wm#mD!ZvuVI?^0<%@ z6N50bu-O0Y#oq;o6NF&p;VFx%ca>)N)mAgBKOBF2`{qv}Y05=0}#>|c_Bw_UG`CypBl!()y$H1B!G+Nc{QGU;@FLV$y@ zLSM^8OIQ<(o~7VJF5H9k)1H!&y@Q?xE2;2oTHW#SnYPn6D7k8W$%$LDk>$bBfp0vN zZk|%ulq5`u>6egufRk85x*U_+14pS=Cnq9hE&X=(t{ywRH(QQh)9`UxSB_8ONA5oL zBWJ}pBgNE;9ubEdHCAa8IqME)Cd#>5T2XbP10a3o0ITbk$nC76_1qkVZLVA^|iZh-RB34%E_(GUN?4kaJOyb6_6YG?Uo@`pa^hm z&6E!3FltAwG#~F?<%^XMTxf8CMer@!U6#{20O;@vekfU_UDfxA3||3MQi!YujuS02 zGbX?)(Z4?|yHN_J;Aj^UpPilM<>hfG@ecg{&8gJN-SWd_(JfeT9;~7Va0tdEq2K>@xvQ8rTeg*c8#Cag34d^ zxP;cA*qrz$YU>hR2M1RUw#2i>E~gW9`tR03V#M=LV?3$Vkp`5TeLrqguLk#{XV4+@ zL)yISKZQ)dY~LyGI*BiWG+-qG_ zFk9c9nn7{+sn0RIWo_z*vFs>*>wC0bd)K^vv!AjTj=TO;=fTM$9>hs}wmGl#8NRI? z^-%RV42uMJc1i{JJeIKApBL~1@$M3w2-fwl(_!Ht^#;vGCE3(JoU68$R8;&jxP*d& z!s)#G?hB;|nZw3V7xeCgin-w_pG_w^m8Z}0vY~~+?r4T2y65SrY$lh?364Bu`q#%t zXY*fYDokNnQLkPOZj|L%PL)hIdkG;9eTC_;U?n{Uax?r`fmOdTe$nlzrk2)fVQKTP zo13Ed6?k}f%M}~2pn5cQeZNqO@guv9(M@u4bRS7`$p=5ytlDz?P#{R394R8=JZ>o( z-}EE1hl|V2d*#*Fqq(PKI6vuixRkvi5l(b@AOUl-hs?74b#0Qwa(|AZ=tg5+}!_VZtD|U8=mr?5mMcC)l!^NgVhhIpyvyRnF!d5dH z@`SE0t|*0nILg8fhH4(a31osM-R;hsPQg${Fa;;f-r!WbYZmTUS)JwmA*m)Sw&zOL zD6~w+gbpV1OmuwcXm39pR}nRu`Sp=FF!=ToHj*Wa%c@(8m#du8UZU5)%5acC#g2jO z4L_1)76s@V5n44?RyMEyeirz_rV|uHC#ybFQdHClfbrg}!-MjzHo+5v8XJl?{Gp+t zuJ^YWY@h7seo+w<%jjjzG`cxdko}zAxdIDo2kXX8I`{YUJKW5Qs_ykxaJorn@)X+r z2sc>T+I&ooo61FqZ;xbssMUwXy6GUgeo^=2k^2HVWwMe-awRr$I~v)`h;FNlx9P|i zQUPS%8~j*UYQ{=a&YMJe5HZCbdvbJXRYugFI|?wRB`yAR-wqepN{wATF(>SjMX%*` zJXQNH{TsLqL%2?uX{^jFd&p;?zvlR@Sf`_2zNymlkkKoB8-703PQ`a=sbI@AAH}Cq zR57C|Afsg;~&1;M{ zTv52;iFR>}eD-v$JzWqk)&AJov2fH%M=REHL zxdwJ;qo#eZ&0~m|p_)0z6z`Dz2T@hpo{@O{^SuOf5qvS-!=;QCUVY`RS;o#X)x?q7 ztuyxy{VeIL(%cN@0w4X{V0}EXpTZ%!$h~fO0=T{OJ`%{Z8yUe6@sXq<7h-R5aikZz zwIgt3tHWh~T;qv6wHyaMCEW8NQEzx{$64k;REn_MugyaZ4UN%U6{-Tu!M;8V;+!*` zI1=s02C|Xl8DwtsvGSZCif`Z0ef!N}F~OAU9MNA{yM3=BdK&VhvwQ2oqOF1))M#Ld-Q^m=^`21}%ITwOV5pe$Fm# zY*(bR+MjUVE{xZq#1$^Bu!kHf&dD%`v)2$J30;`PGXH2WvaMF$kiU+EvyAc~nrST> zwXY4mk4CMpjRpIDEM-zk(46xPP%a~^hQebgu-9zMe??eL`g|HJ6HGfu*(+i zFS_p(Z_d?}_Kd}{M?Y{v8NjrUL_tGG7c-uK@RvLvkCh{g4#v40@AT~v8ckx;G7IE9 zA%Mw>!I*1@tdcy_tCYS7UEEl)aE$BHH2H)r4T*ac&rY;;_h$$BNt!e9Ka-c%pvjD$ zJ^#jkemjuBrI||q>{&Vhb(DLRS$og+7n_9sey&q!KHZs$+OF;Elh=InhK8A0-jSr* z>~-Ueheu6LP7WHb$Z0gwTqW05#H)~|NU$O+pu()aX|Ufc5p_mu2$PC|M8aq=epGF( zPsu^-qR|=sVX@Fe{xTBLUVF;RAz2fG^sW1{4Cz_ECi}Sx(~U*dE6crxr|_z$l<0WH z8N-s6yC=*1b}wIRv>9pLL^BaBqa-%_8;^@RoM^2O5fVxA+)zv@x;y}F`*AX5WnS;}SkXn@F>}DLfRsLz@#{24nxri}&rsGed`o1z%cVZyd7t#Wjm3&R+0zY58u>mU6t%UBJcTl8jkH4=^-MuP) z=S0Gn%1zM0>9(HzD))@{?Shkw`*F%TL>XD*WyLstJ5qEnt#$HJeN`6|t4mGHjBs~- zMyi8d5!X$pjJQ!2`hqKEgvd_I+%MZNa!@mW!mL>NdiH1f^^U(`cL4$KUMv|#fg>2# z!F8|tmCMiHKYxr1yK-w#8z8!o5!C_?Ko{rdk1mir;?%y6W7GLG^#_#8HrhJ)~v@Yo*?KR}|X??#GN@_)~dqg3@+gNF8Iyvx7m zMvUJ$WHx8BYK$#JC33pVGzSbnvL$FN`^{LLgJ}T_RHT5Kc`brJOoYg;PP)pF50x@kCc>`$DAy8Z=wXX-O;p2W=2sF z7J#NzH#f-w4)9Eso^d>18!4LQD_^?B?o%a4m0j%n;Ed9CE3T>akaEk)z24?RXNs$x zFg@rrSku!}$8B`?@f@Y;8e4<#4j!97(1WEG(O7m+Q0O)MDWUMV5%D-zWsiGlHbNbI z-Z}R5QeH(R*XGAHAOmCK;x@jWN@28_rg;T{LMf>k5Y~x7``41!7n}M9=&OIzj23^) zHmzK@rPg@M%@-SmwdM?}>rk-uHM4oF*9+k6#V|ze-R#U<9{-FC4Q*R)^B4EmFYQ6W z6&|tb(w#lTpaCUOYr{daCFiq=OAkQS);sOUto3hC7Ah&EjRcfVS{%(n!zTa~1eR{A&RoZeV=zV+kmXL@jBO?QeECLNMW>cjGJ*grdhv##)upc@$ z;^5#NfyX+m{YE=?Kv#;GjRJed5COv`Eh21()}0?cdc^6pt?7B#hCbn(tC-*i2+!QD zcdTq~Hk4kcYD|Qf+hxkB!l6mF&7^?o>Hbr!qxSy&LvcLTRardLJWXZ6@n>&)oLLlb2Uc85;_!n1C-{oGiPxXP;bi-adB}3=|KsF+lQ>2 zZjJMMU01$lA;d&QMHR~(&uDH=W$vhYl>@!MBjGegJwyKvn85&F6m(iPHf*2=N(bXm z02y0VTRRL;EGB@JnNau%3F2D=N90clbe~zOa~m+q7@N9zv2wvbD5{qlZcsEckc2PbVd1mz7#@`!11eQF6E8z1L%SXV5)8Lco?K~UlhXL!O3cehW$oFvDeM{biGsI6mgxy-+qsSCfVC6VHdy; zAxL~wboB9D9{k!J%7~|YI0|tuoMv!cZg5CsIzbjs+UV}=jDIBxe>?5CErH?AR%9C` zq7(uVf4lF{vQXz{PMhIBNM-FYW-96n;|Bm3w*`Lu2+X`}W7`(QNyJNYQU5_a! zB8qitGT)Z!>kr23ftLzj%sagM^&!+iv3J~z8|UqU7vL`NNk}%Oqdd`RP-m|_NtXNs z3T23N$RMan2_J9jzj44RGzfk)@Da#ZSHCwKH!7KNHZ%BXt-)AN2h}^Bq2hzcy?)(B z1%>;9JDlQr{^e!KDhyU`I!yWHDc_LEtDiYJs~|qhDJWze|DHsjUbxr{e4^h9_$(i#$6SHD2L58}j(Fgvh)0E)!<=Imw%4bSY&6?Fg#joG||GI#paA_upnKzS*_>1EC` zUz$N~MMRDFBZr!5tCRAKV!V$_KSUVWW0m*b!#C%fb78|z1qB7kNJ&Yj0p>x&Cj0w? z&mj^PotPM=^6IM7H~~-g4$y9BfE?-u86hS*dc>IOih~K8+DB3shv(_O zd=6pV-nFzLebo}owptAQzt~|v(Hc6hl5*7x($8yn%pzfSH+wZE1M!@fw--xClWz@- z08IsSNgL-#5s=+`A}Kg+=J^$qc(H*9XYuFZ?f_Nl#?fI1F6{2+01+mRx}F#;M~U9y z-Dc1Ow)gvYLgCA0e;^JC&Q_XB5;YfFMnpyBTIg52NY;Hg91|H4(UqI#9TunW{xHq+ z_~FZ!FYVU)h;qH(ci59>W@d7H=*2_mSFoNaSu3lejzj4Etqb`p&*>bI)D2G4p=4r% zv>K_Dmbqd=Or?U<5kdad%^KE{YpJ%hbx?4W;?rmrqbTt;e=`C)?gdjvq zK>gLOxr<~77(>WSNwn8XL<~n|_wjJ>tPQ?chm;*WZz#6LB?`CO|NcEc^iCKc zDn!(ekU>e^z{kV$$;)E`>w)w8_iqvoLrA^z9ww;0v_$3Q_VBqU4+@-cHPrXRH!!#5g!ei8r|LLwrhjg4u)e)|^l^{XGa6bQ%~!F<-U+(kMy zL+d=b+1W<-cel%KiyK>719z%!IO`w1!Y(wZx|VyNUEeTpr*HR}j#yeKlKKX{6~m=g zRppDt1%`tmmlQ|!!IbL-@BfVK&jX0^K}0pK zIh2!=YwZjr&{=EBA0xSb;^7aH<0(%w+XQ&hcrd!UQlOg)^`~wr3wL(~D-l8+~G+J0Ed? zi6h3cspza|M_%Am9jtis=syEshn$`s#jBfLu7(!T^Jx=RCc;b$@jJig{DG7ctxi;dxjGf1}e)EYx7iY@zXIn4bbT1{wI zNSWa&rY5y~yDy5kkt9Xr#RbN zJu)j0c0**Tye3NFL|H_S6OPzF+1>?tk1#v2DHm8qFme}?^8X3a9`yZH$ggTcGQ$uj zhlHd0RMc9`Bnm|$TmBu4{RlnYD`un~vkzDp@2hxdP(c*t+~ssT{xHrrf7@nIF33Pl z?z1A2W|wR}LtA5ki~+nlxzheJk0drbQ1~4&BhQj9e`ROiX(n<42jpE=cv#p7!1DmU zpjW%zU2WXR7!5P;P{=jey>iA#K=fC>dFQsYP?a6~W&pX3>RV1F3e7z>J9tv3gE`=6^I5 zgy%=m_1=|chij8bwAjiIWfomJ%i0k2#gu{MYp(}+PbRo3Vh9(J*w5obbd23^yjp?< ziXgxd3U$Mvxy=4cqCceXZ=sZufkn-sNl12YS?mUJ_q9!>1bb}C268!IfIirnk zza=n`{^#u-H_LZ3Usa)h`rrTWif1_V5hmSQ)TjUR*>ZT{2EgDu8lnH0fp2O)E&b1- z`_3_w3+xSl@kjsPv+Hv|VDaJKaO%&@{-BQ`ql)_g8xA!_w0t(O_%u7`Pl{t8Ts+&` z+lV9~jz|6NHy${$fXyJz{j_=J4(P^=k`jahr=Cv;;6KKrNB)}3XH_0wTBy}qFGQ}L zoSb?G2fKjtEE7z{J!4=%AVY*p zVQg$HU6WbFy`{ge?+_q$THc|)X$&Ke*XMPO-qZsUfZ7r z7`ff~I)Vo0JqbWb17SijFxXA_0XljXAS3`z?4WR&_XVntM22bzj!KbM;Ur=#z47@IQ{i~!^XfZ9@m;oFt)y;1#xL|0OAJOE4|zHjjs zaRY?+ZzaA3sqgaiNXy4RqNBz1y{|s1zk9byOl4_d(Oa|Rt-zp?s%UItqO&^(Sn=2T z`jq&nZESb=#vwh4iDbVVHk6OI3roMMWy!?!_VyBAkpa1h((_RK^W~vY&CNBCNMarm zFhu+K_z+)B16SBD*CS(fef@pjdkoI`6QBlspa0y?CItY&4P9LS?`RsyUf{ow0}y0> zRRQot2?7ob45WUr3)ZGZ#o-ynOK@Quyu? z_Kbz4zj!NRMT8my`Ka3&ppsu^qqJWW6Xl;hejWZewMi*o^J`c56M|x`ov%@RHuKc% zO{b5|$8#d)yuSVZ@E1@S3}8#Kh4lcl$1mXPd--XAo>f|Hik4>*{TH_xt#uX3k$euK(MPFGhq+zS&2hXEL3=(4l3UtDFX=l6!Q zH!~GL94ei*CqjW+Y|480@D6BI?(X$-2lPGmAKC*R{sm4s{omo!>&=5%Ja|>wN`H#p zOM;sg`8ql?2UsjwU`dg_X)tUs~XklpSAf zq%{zV$^hHSZy--9xu#xhHhl>TqeaIdH;XC7I#?Yg>jlg9w`yR>JqaNL)r|rt%Ex^wvqBUn%?X>eJV!qa1^0aBG%m^js_Xqu>qnsog+O@T{On6~l9yK^D z=kY3F*G@Ep?HdCQp8LR)P$`K&C3-t!T)J9XGC?>L+f}ECyBtat**W2}tRA(dOhK0@ z3WBxKg{Y~jia9m1!#F`yc=Y52p_8(+Gw-K?c%#voo!7s9 z{o?r8N4V)ISO9w<-ui`<>kv4oT&KAeL(fuKOpMS0`!JMx#AV2>5Y2cVe4hB)+c$4w zhb^cfArcwX4<0)6)EJpgps~ zIfKpbM*%~!UaJ#M1L9Yc`J>c@vl_^#pECp~V(l9cj&&+jLEQyDzcJ6(>#fY#K-dsALcoA>SY3ZgXbjiCc<6NH5FFNoAe zU13CkOL#b8QKcaS2#hXZ3N~H&Rs{{fgTtuq@os5Br3m=&5TM)B0jnzz}JHg^1VMoSW_)@v!0;eY+*k@HUf*1^ZebhnDSwR_<{(&7CN9~ zAV;1LEG<2I^JQjNBerSEX3O0*OBGekg7ee-;$kN=+nqnf6LhB_Gf~V6+AaI!Rf5^+ z1s~Z93?SAy__6ZR&b!m%XgK6@)(*YVG?e{uh-hbvi8rgp0?@&S&Jg?wXLKwQvAxoA z$ZKU~285MtJowKaEpWg=;VQqk1d64USwan;5K?QpPt(6Nndt%h=3r*KKVLU-j_?Rs zh!z$UNSzhJ!5lbS55{x)_XX*`V2q88&D{3_MXuZVjOlAJF`w~MVPKeK76myje*=a{ zAey{s9{U2p&Z(ZqueWP)u(9buO3pl1$yQf;LJMM+^YdY&Bp1GxEveisNAAxn?GLtp zYXQrJ6yB!b*pe#@`*_jg03Yyx+w=qy7&8qn>?{0{eJ#LtAXLRz4atx$ocs!MvicI8 ztb+uqI5nWdvVV;OPg&-qMgHxxfN1c9+RfE!IQwiB7a%W~pLQdU69GIR=jGM3ummi# zX9Y-LV`by;F){}CeFCoG-B$!)Q5|=uV+2b;UHy#N2AJ!V^?W$sXL?z7QOI2{De)v)fSu+00%Mze>iXEGXjisTyFK%yd!EnW9Ftr(vpvhrQ>48hZ=^WC+L4UH74 z$B+GhzeoMXw8Z?;8n8{JXJ#Ugj*brQB0xbOnqjZm{p|tNWUVjua&GAk;n`lPp0knE z)lF8od&;vH&W)&|Vr!7Vrm?4g)-othssqI4oQJx%eG5Fao@kI zQcN{_dBi1QGyrwTDS3q7lUq=*e#RDTeqxFe5TgO2D6^j91rQfe6NA}r15RT*K%;~w zh9g0quB_Qz9@fF}wa3fH2iezsiWt<3p==XMasSzBwOL z010{Ws#|d(_LT7HQ-wWKY3abhQ|`}yjmhyVr19oaPfP3e&o#F|yhZrj`s3K2 zym6iWbq|c!h9J>t_T1Dz?AJRtOHxLNy1O%DVB#md$r#Vy&ppDy=>}4N{vLl;ULFRO z=OL2&*><3S!#a18s@aZvK|#ShadRO6krZMM_hw#P%@~(D-mR4`JnZX+PzBcgU!_w! zoPZny7WOjfbGRK+%Xi14=~^tv3y zY5hxXu5J+}06&z#wKbRsDTk>%Qv_b_>7E$l*n|>?^X++Et;J37pt+dnEAi#>5K%(% zg4f92ZaUG6j7ANwLF20Gnz(_ z+-6Z6?{8k4RlbAMRD7tfTNjA*&*d$@Y_A3oO2@W|em1q?vZ6D~Y5cng$isTdD#m{_ z03voaD>Uhe1cpzs3a8%rHiRSSO`+Bd_S`5rzHP?%mesY)oXf_x7ok7n2}5kHt?loeOACWehSY6107(FN)^SG# zJ14jT>;Za3wp~dCK0lNBLgEY5PXuQ1INucq;A0Zc#zVK>@gZ={mI-%hh zuqA`K(DJAc!x(hwWC-p9GYlT8_$l5e&P$EO&awz|!XLTk#z)l)$;speCs|op2!@api@S|XbEpw1WHH{Fg{V4+*10_hcVRa50tB95o5Izvi zC*a1=K_b9!I>m$l6>;K|D|decBq(wp6x^Zpkw5m$8MS|W|Go_Jv-dZuvL@T}M#eAh zEakNwuLcvPAP6g1+)H}Xcs`@5b=TdI4F9bLx}oVx^KWLNEX>S#=z>5O39Ghkiu?Tm zp`U=7vm7+CBm-6(^r_&VX?X&&J?VUWY%I?jSVe1RT2WN?%^&eeU;r2Po;rW!rJ%zH zj}4D-`^Sh&wlD%uNyT_(OMhCHSgqwRaIj zwS23I$;p*a##D|7)X(dne(*Q~dW6Qz54mSK(od{s=0L>+tg*%x`j3;ELCb*D8oJ>n z^G`Mp5N2v&kwSTUjVD7wuHYnRXcbD|uwWn~{Qd7MJ{f@uQaMURPEPD%e<2?}X2u=Q zZ=boPkg>09yFU~a@7%JE)W7n1f5I5wWQl05dKZ|-R8v~O9FMd2sBI03; z@6j^<@g4vfYu@{I%DEcbp1;4psp;$6Oi|LHBD}t!$3sb^%^E;8z+Kz9Hi61STw9y$ z(_rF9?YJ=B=1x}0F<=62IPV+?Vhk|c8p|f(x1&bDXuul;-+_AQ!>3QiZGI1cfYY77F! zz7ZJs=0rXLkU0AK`|Wq9IS~pjP$4qmK>kYA5Ji$Sy#pc`;=ruzHyi+(fs4bq6C>Dx z8^kiD!PndffKozLv*^wOx~&*2$~!@BG2WiYM|8opc;6ygS~fSSzkSMsK+uH{-wR*{ zba~L|xC{o1;Jl^|OKiv`Nr<_pdpp(-@u7rG$;(x^?ff;lL+nt2Iq5k*}_OTfXHnHU6- zns~rQKAy41{)bs#ToOFt*?uV~OQ!DHSK0usDKsHc~QRPKW?VSC4 z5alA1_R4GCxW@pI-%{PyNu!i}Dr7+$Ab<4jGg*Ay4V^YWm`wW$^a_zygi%BIY{#Gi;l)a#FR_0*#Ss9%ng@4 zVdLffx7|Qy#3v+tCdeuaP5~M?>21K-EOj+mY9JbJo7jL73F83b3SgH8PE+j4lXPG7 zwA`Js!w;bMlAk~S(z)e&{NxGaEPLukx#O1lKh2NPPbBoe>~6w?$C3kVfS|624e~8X zG4?t6Cey^oAyjEF_fM{_t^g`*R-ym3O&?lnKUTYR9k)kU=7xNTl+1vc_^mOX*zy~Qaz{a8Ztskh*s;bfbcT~V@)8KL-12|nkZ3F{S5rls6 ztkL)%cOcq>k_+f<7!Mzc|JOMi1HuMi1nGeN1(^79ICMi*Wb@pAVuQ zVe>)`dVd5CWe=!8qGMwN!K`Qf`t=x)3pokLfUgIeG$tly6L^Txut3Q~^FTaN~eX4~oGM#!XN}3zR?tKVtKb>7h==qh?mb)ZjLR zhdm~N9afW>NRv5s>yC^|3Pi$4m?xP5um}N?0rWQ$+Y^zHn33`BTHk}lA|Pm_YZZ!P zaCXH>WS9{f6hW>W%*PcSVT*9;oFq%YOY&R|8^EoxwHdz6Sj!(vUt?imRSMB9Obv%C zGE@k)_ru9;uYpNTLPEmo)syqpa5Muw-0@TGZFYK6AkN%wOc@_lwI~Yxq0}2nL5NGU zsm?*Aw<}uXqK7;vm3pS`URoQR_}pVX zM5v4RaBbG+^EmUH+0~>?a#I15*nihe(Z;%4W*?8N0^e!k5RdrY6_M<&RZD0>b*U1| zbwUl_%YPS?2=~QXb$})~XFd=&dyhg7R3p{TpkobWLVl4KG&D$v?_zi&Y+Q*NSy>qz z4x}s+=<8_?{r`k0y|E%Rg!G0L7yauPyp@Bb#IQVB=-;Et_)nQhQ&Rsv8r)|BFOSic zMi18iB&yQ)jDm=l>H4v44E?);;RB5Sp7=lgtBmZwCsyx~Smlk?!Z%W}!FTRJUP~)W Jl}H%+{Xe$uM)Cjv diff --git a/assets/nf-core-nanoseq_logo_light.png b/assets/nf-core-nanoseq_logo_light.png new file mode 100644 index 00000000..d46347c2 --- /dev/null +++ b/assets/nf-core-nanoseq_logo_light.png @@ -0,0 +1,11 @@ + + +503 Service Unavailable + +

Service Unavailable

+

The server is temporarily unable to service your +request due to maintenance downtime or capacity +problems. Please try again later.

+

Additionally, a 503 Service Unavailable +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index c13fd9d4..5047c306 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -12,9 +12,9 @@ $email_html Content-Type: image/png;name="nf-core-nanoseq_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="nf-core-nanoseq_logo.png" +Content-Disposition: inline; filename="nf-core-nanoseq_logo_light.png" -<% out << new File("$projectDir/assets/nf-core-nanoseq_logo.png"). +<% out << new File("$projectDir/assets/nf-core-nanoseq_logo_light.png"). bytes. encodeBase64(). toString(). diff --git a/bin/markdown_to_html.py b/bin/markdown_to_html.py deleted file mode 100755 index fedf1097..00000000 --- a/bin/markdown_to_html.py +++ /dev/null @@ -1,91 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import argparse -import markdown -import os -import sys -import io - - -def convert_markdown(in_fn): - input_md = io.open(in_fn, mode="r", encoding="utf-8").read() - html = markdown.markdown( - "[TOC]\n" + input_md, - extensions=["pymdownx.extra", "pymdownx.b64", "pymdownx.highlight", "pymdownx.emoji", "pymdownx.tilde", "toc"], - extension_configs={ - "pymdownx.b64": {"base_path": os.path.dirname(in_fn)}, - "pymdownx.highlight": {"noclasses": True}, - "toc": {"title": "Table of Contents"}, - }, - ) - return html - - -def wrap_html(contents): - header = """ - - - - - -
- """ - footer = """ -
- - - """ - return header + contents + footer - - -def parse_args(args=None): - parser = argparse.ArgumentParser() - parser.add_argument("mdfile", type=argparse.FileType("r"), nargs="?", help="File to convert. Defaults to stdin.") - parser.add_argument( - "-o", "--out", type=argparse.FileType("w"), default=sys.stdout, help="Output file name. Defaults to stdout." - ) - return parser.parse_args(args) - - -def main(args=None): - args = parse_args(args) - converted_md = convert_markdown(args.mdfile.name) - html = wrap_html(converted_md) - args.out.write(html) - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/bin/scrape_software_versions.py b/bin/scrape_software_versions.py deleted file mode 100755 index ffabc860..00000000 --- a/bin/scrape_software_versions.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -from __future__ import print_function -import os - -results = {} -version_files = [x for x in os.listdir(".") if x.endswith(".version.txt")] -for version_file in version_files: - - software = version_file.replace(".version.txt", "") - if software == "pipeline": - software = "nf-core/nanoseq" - - with open(version_file) as fin: - version = fin.read().strip() - results[software] = version - -# Dump to YAML -print( - """ -id: 'software_versions' -section_name: 'nf-core/nanoseq Software Versions' -section_href: 'https://github.com/nf-core/nanoseq' -plot_type: 'html' -description: 'are collected at run time from the software output.' -data: | -
-""" -) -for k, v in sorted(results.items()): - print("
{}
{}
".format(k, v)) -print("
") - -# Write out as tsv file: -with open("software_versions.tsv", "w") as f: - for k, v in sorted(results.items()): - f.write("{}\t{}\n".format(k, v)) diff --git a/conf/base.config b/conf/base.config index e4510c84..754c711a 100644 --- a/conf/base.config +++ b/conf/base.config @@ -52,4 +52,7 @@ process { errorStrategy = 'retry' maxRetries = 2 } + withName:CUSTOM_DUMPSOFTWAREVERSIONS { + cache = false + } } diff --git a/conf/modules.config b/conf/modules.config index ab9531fd..e969133a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,117 +1,332 @@ /* - * -------------------------------------------------- - * Config file for defining DSL2 per module options - * -------------------------------------------------- - * - * Available keys to override module options: - * args = Additional arguments appended to command in module. - * args2 = Second set of arguments appended to command in module (multi-tool modules). - * publish_dir = Directory to publish results. - * publish_by_id = Publish results in separate folders by meta.id value. - * publish_files = Groovy map where key = "file_ext" and value = "directory" to publish results for that file extension - * The value of "directory" is appended to the standard "publish_dir" path as defined above. - * If publish_files == null (unspecified) - All files are published. - * If publish_files == false - No files are published. - * suffix = File name suffix for output files. - * - */ +======================================================================================== + Config file for defining DSL2 per module options and publishing paths +======================================================================================== + Available keys to override module options: + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. +---------------------------------------------------------------------------------------- +*/ -params { - modules { - 'get_test_data'{ - publish_dir = 'test-datasets' - } - 'check_samplesheet' { - publish_dir = 'public_data' - } - 'guppy' { - publish_dir = 'guppy' - } - 'qcat' { - publish_dir = 'qcat' - } - 'pycoqc' { - publish_dir = 'pycoqc' - } - 'nanolyse' { - publish_dir = 'nanolyse' - publish_files = ['.log':'log', '.gz': '.'] - } - 'nanoplot' { - publish_dir = 'nanoplot' - } - 'fastqc' { - publish_dir = 'fastqc' +process { + + publishDir = [ + path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + + // nanoseq.nf includes + withName: CUSTOM_DUMPSOFTWAREVERSIONS { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + pattern: '*_versions.yml' + ] + } + + // INPUT_CHECK + withName: 'NFCORE_NANOSEQ:NANOSEQ:INPUT_CHECK:SAMPLESHEET_CHECK' { + publishDir = [ + path: { "${params.outdir}/pipeline_info" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } +} + +if (!params.skip_basecalling) { + process { + withName: GUPPY { + publishDir = [ + path: { "${params.outdir}/guppy" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - 'get_chrom_sizes' { - publish_dir = "${params.aligner}" - publish_files = ['sizes':'genome'] + } +} + +if (params.skip_basecalling && !params.skip_demultiplexing) { + process { + withName: QCAT { + publishDir = [ + path: { "${params.outdir}/qcat" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - 'gtf_to_bed' { - publish_dir = "${params.aligner}" + } +} + +if (params.run_nanolyse) { + process { + withName: NANOLYSE { + publishDir = [ + path: { "${params.outdir}/nanolyse" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - 'minimap2_index' { - publish_dir = "${params.aligner}" - publish_files = ['.mmi':'genome'] + } +} + +if (!params.skip_qc) { + if (!params.skip_basecalling && !params.skip_pycoqc) { + process { + withName: PYCOQC { + publishDir = [ + path: { "${params.outdir}/pycoqc" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'graphmap2_index' { - publish_dir = "${params.aligner}" - publish_files = ['.gmidx':'genome'] + } + if (!params.skip_nanoplot) { + process { + withName: NANOPLOT { + publishDir = [ + path: { "${params.outdir}/nanoplot" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'minimap2_align' { - publish_files = false + } + if (!params.skip_fastqc) { + process { + withName: FASTQC { + publishDir = [ + path: { "${params.outdir}/fastqc" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'graphmap2_align' { - publish_files = false + } +} + +if (!params.skip_alignment) { + process { + withName: GTF2BED { + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - 'samtools_sort' { - suffix = '.sorted' - publish_files = ['stats':'samtools_stats', 'flagstat':'samtools_stats', 'idxstats':'samtools_stats', 'bam':'bam', 'bai':'bam'] - publish_dir = "${params.aligner}" + withName: GET_CHROM_SIZES { + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - 'medaka_vc' { - publish_dir = "${params.aligner}" - publish_files = ['.vcf':'medaka'] - args = '-s r941_prom_hac_snp_g507 -m r941_prom_hac_variant_g507' + } + if (params.aligner == "graphmap2") { + process { + withName: SAMTOOLS_SORT { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_INDEX { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: BAM_STATS_SAMTOOLS { + publishDir = [ + path: { "${params.outdir}/graphmap2/samtools_stats" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'sniffles_sv' { - publish_dir = "${params.aligner}" - publish_files = ['.vcf':'sniffles'] + if (!params.skip_bigbed) { + process { + withName: BEDTOOLS_UCSC_BIGBED { + publishDir = [ + path: { "${params.outdir}/graphmap2/bigbed" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } } - 'bedtools_genomecov' { - publish_files = false + if (!params.skip_bigwig) { + process { + withName: BEDTOOLS_UCSC_BIGWIG { + publishDir = [ + path: { "${params.outdir}/graphmap2/bigwig" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } } - 'ucsc_bedgraphtobigwig' { - publish_dir = "${params.aligner}" - publish_files = ['.bigWig':'bigWig'] + } + if (params.aligner == "minimap2") { + process { + withName: SAMTOOLS_SORT { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_INDEX { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: BAM_STATS_SAMTOOLS { + publishDir = [ + path: { "${params.outdir}/minimap2/samtools_stats" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'bedtools_bamtobed' { - publish_files = false + if (!params.skip_bigbed) { + process { + withName: BEDTOOLS_UCSC_BIGBED { + publishDir = [ + path: { "${params.outdir}/minimap2/bigbed" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } } - 'ucsc_bed12tobigbed' { - publish_dir = "${params.aligner}" - publish_files = ['.bigBed':'bigBed'] + if (!params.skip_bigwig) { + process { + withName: BEDTOOLS_UCSC_BIGWIG { + publishDir = [ + path: { "${params.outdir}/minimap2/bigwig" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } } - 'stringtie2' { - publish_dir = "stringtie2" + } +} + +if (params.call_variants) { + if (!params.skip_medaka) { + process { + withName: MEDAKA_VARIANT { + publishDir = [ + path: { "${params.outdir}/DNA_variant_calling/medaka_variant" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'stringtie2_merge' { - publish_dir = "stringtie2" + } + if (!params.skip_sniffles) { + process { + withName: SNIFFLES { + publishDir = [ + path: { "${params.outdir}/DNA_variant_calling/sniffles" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'subread_featurecounts' { - publish_dir = "stringtie2/featurecounts" + } +} + +if (!params.skip_quantification) { + if (params.quantification_method == "bambu") { + process { + withName: BAMBU { + publishDir = [ + path: { "${params.outdir}/bambu" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'bambu'{ - publish_dir = "bambu" + if (!params.differential_analysis) { + process { + withName: DESEQ2 { + publishDir = [ + path: { "${params.outdir}/bambu/deseq2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: DEXSEQ { + publishDir = [ + path: { "${params.outdir}/bambu/dexseq" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } } - 'deseq2' { - publish_dir = "differential_analysis/deseq2" + } + if (params.quantification_method == "stringtie2") { + process { + withName: STRINGTIE2 { + publishDir = [ + path: { "${params.outdir}/stringtie2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SUBREAD_FEATURECOUNTS { + publishDir = [ + path: { "${params.outdir}/stringtie2/featureCounts" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - 'dexseq' { - publish_dir = "differential_analysis/dexseq" + if (!params.differential_analysis) { + process { + withName: DESEQ2 { + publishDir = [ + path: { "${params.outdir}/bambu/deseq2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: DEXSEQ { + publishDir = [ + path: { "${params.outdir}/bambu/dexseq" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } } - 'multiqc' { - publish_dir = "multiqc" + } +} + +if (!params.skip_multiqc) { + process { + withName: MULTIQC { + ext.args = params.multiqc_title ? "--title \"$params.multiqc_title\"" : '' + publishDir = [ + path: { [ + "${params.outdir}/multiqc", + params.skip_alignment? '' : "/${params.aligner}" + ].join('') }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } } } diff --git a/conf/test.config b/conf/test.config index b4b12b00..3a3eecba 100644 --- a/conf/test.config +++ b/conf/test.config @@ -11,24 +11,24 @@ */ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = 6.GB - max_time = 12.h + // Limit resources so that this can run on GitHub Actions + max_cpus = 2 + max_memory = '6.GB' + max_time = '6.h' - // Input data to perform both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' - protocol = 'cDNA' - flowcell = 'FLO-MIN106' - kit = 'SQK-DCS109' - barcode_kit = 'EXP-NBD103' - run_nanolyse = true - skip_quantification = true + // Input data to perform both basecalling and demultiplexing + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' + protocol = 'cDNA' + flowcell = 'FLO-MIN106' + kit = 'SQK-DCS109' + barcode_kit = 'EXP-NBD103' + run_nanolyse = true + skip_quantification = true - // This variable is just for reference and isnt actually required for the tests - // Files are downloaded and staged using the "GetTestData" process - input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/barcoded/' + // This variable is just for reference and isnt actually required for the tests + // Files are downloaded and staged using the "GetTestData" process + input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/barcoded/' } diff --git a/docs/images/nf-core-nanoseq_logo.png b/docs/images/nf-core-nanoseq_logo.png deleted file mode 100644 index d71a24951fa9abcd9335b37a1198c9110023a7ce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 35189 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 z + + 508 Resource Limit Is Reached + +

Resource Limit Is Reached

+The website is temporarily unable to service your request as it exceeded resource limit. +Please try again later. + diff --git a/docs/images/nf-core-nanoseq_logo_light.png b/docs/images/nf-core-nanoseq_logo_light.png new file mode 100644 index 00000000..1993002f --- /dev/null +++ b/docs/images/nf-core-nanoseq_logo_light.png @@ -0,0 +1,13 @@ + + +507 Insufficient Storage + +

Insufficient Storage

+

The method could not be performed on the resource +because the server is unable to store the +representation needed to successfully complete the +request. There is insufficient free space left in +your storage allocation.

+

Additionally, a 507 Insufficient Storage +error was encountered while trying to use an ErrorDocument to handle the request.

+ diff --git a/docs/output.md b/docs/output.md index 6a367f8d..67030f6a 100644 --- a/docs/output.md +++ b/docs/output.md @@ -230,10 +230,9 @@ The pipeline has special steps which also allow the software versions to be repo Output files * `pipeline_info/` - * Reports generated by the pipeline - `pipeline_report.html`, `pipeline_report.txt` and `software_versions.csv`. - * Reports generated by *Nextflow* - `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.svg`. - * Reformatted sample sheet files used as input to the pipeline - `samplesheet_reformat.csv`. - * Documentation for interpretation of results in HTML format - `results_description.html`. + * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. + * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. diff --git a/docs/usage.md b/docs/usage.md index cf0ca289..b33902cb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -330,42 +330,6 @@ process { > **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. -### Tool-specific options - -For the ultimate flexibility, we have implemented and are using Nextflow DSL2 modules in a way where it is possible for both developers and users to change tool-specific command-line arguments (e.g. providing an additional command-line argument to the `STAR_ALIGN` process) as well as publishing options (e.g. saving files produced by the `STAR_ALIGN` process that aren't saved by default by the pipeline). In the majority of instances, as a user you won't have to change the default options set by the pipeline developer(s), however, there may be edge cases where creating a simple custom config file can improve the behaviour of the pipeline if for example it is failing due to a weird error that requires setting a tool-specific parameter to deal with smaller / larger genomes. - -The command-line arguments passed to STAR in the `STAR_ALIGN` module are a combination of: - -* Mandatory arguments or those that need to be evaluated within the scope of the module, as supplied in the [`script`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L49-L55) section of the module file. - -* An [`options.args`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L56) string of non-mandatory parameters that is set to be empty by default in the module but can be overwritten when including the module in the sub-workflow / workflow context via the `addParams` Nextflow option. - -The nf-core/rnaseq pipeline has a sub-workflow (see [terminology](https://github.com/nf-core/modules#terminology)) specifically to align reads with STAR and to sort, index and generate some basic stats on the resulting BAM files using SAMtools. At the top of this file we import the `STAR_ALIGN` module via the Nextflow [`include`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L10) keyword and by default the options passed to the module via the `addParams` option are set as an empty Groovy map [here](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/subworkflows/nf-core/align_star.nf#L5); this in turn means `options.args` will be set to empty by default in the module file too. This is an intentional design choice and allows us to implement well-written sub-workflows composed of a chain of tools that by default run with the bare minimum parameter set for any given tool in order to make it much easier to share across pipelines and to provide the flexibility for users and developers to customise any non-mandatory arguments. - -When including the sub-workflow above in the main pipeline workflow we use the same `include` statement, however, we now have the ability to overwrite options for each of the tools in the sub-workflow including the [`align_options`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L225) variable that will be used specifically to overwrite the optional arguments passed to the `STAR_ALIGN` module. In this case, the options to be provided to `STAR_ALIGN` have been assigned sensible defaults by the developer(s) in the pipeline's [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L70-L74) and can be accessed and customised in the [workflow context](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/workflows/rnaseq.nf#L201-L204) too before eventually passing them to the sub-workflow as a Groovy map called `star_align_options`. These options will then be propagated from `workflow -> sub-workflow -> module`. - -As mentioned at the beginning of this section it may also be necessary for users to overwrite the options passed to modules to be able to customise specific aspects of the way in which a particular tool is executed by the pipeline. Given that all of the default module options are stored in the pipeline's `modules.config` as a [`params` variable](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L24-L25) it is also possible to overwrite any of these options via a custom config file. - -Say for example we want to append an additional, non-mandatory parameter (i.e. `--outFilterMismatchNmax 16`) to the arguments passed to the `STAR_ALIGN` module. Firstly, we need to copy across the default `args` specified in the [`modules.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/modules.config#L71) and create a custom config file that is a composite of the default `args` as well as the additional options you would like to provide. This is very important because Nextflow will overwrite the default value of `args` that you provide via the custom config. - -As you will see in the example below, we have: - -* appended `--outFilterMismatchNmax 16` to the default `args` used by the module. -* changed the default `publish_dir` value to where the files will eventually be published in the main results directory. -* appended `'bam':''` to the default value of `publish_files` so that the BAM files generated by the process will also be saved in the top-level results directory for the module. Note: `'out':'log'` means any file/directory ending in `out` will now be saved in a separate directory called `my_star_directory/log/`. - -```nextflow -params { - modules { - 'star_align' { - args = "--quantMode TranscriptomeSAM --twopassMode Basic --outSAMtype BAM Unsorted --readFilesCommand zcat --runRNGseed 0 --outFilterMultimapNmax 20 --alignSJDBoverhangMin 1 --outSAMattributes NH HI AS NM MD --quantTranscriptomeBan Singleend --outFilterMismatchNmax 16" - publish_dir = "my_star_directory" - publish_files = ['out':'log', 'tab':'log', 'bam':''] - } - } -} -``` - ### Updating containers The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. If for some reason you need to use a different version of a particular tool with the pipeline then you just need to identify the `process` name and override the Nextflow `container` definition for that process using the `withName` declaration. For example, in the [nf-core/viralrecon](https://nf-co.re/viralrecon) pipeline a tool called [Pangolin](https://github.com/cov-lineages/pangolin) has been used during the COVID-19 pandemic to assign lineages to SARS-CoV-2 genome sequenced samples. Given that the lineage assignments change quite frequently it doesn't make sense to re-release the nf-core/viralrecon everytime a new version of Pangolin has been released. However, you can override the default container used by the pipeline by creating a custom config file and passing it as a command-line argument via `-c custom.config`. diff --git a/modules/local/bam_rename.nf b/modules/local/bam_rename.nf index 54aabeae..940b96a8 100644 --- a/modules/local/bam_rename.nf +++ b/modules/local/bam_rename.nf @@ -1,14 +1,10 @@ -// Import generic module functions -include { saveFiles; getProcessName } from './functions' - process BAM_RENAME { tag "$meta.id" + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img" - } else { - container "biocontainers/biocontainers:v1.2.0_cv1" - } + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + // 'quay.io/biocontainers/biocontainers:latest' }" input: tuple val(meta), path(bam) diff --git a/modules/local/bambu.nf b/modules/local/bambu.nf index fab6d607..b51e80e2 100644 --- a/modules/local/bambu.nf +++ b/modules/local/bambu.nf @@ -1,17 +1,8 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process BAMBU { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } conda (params.enable_conda ? "conda-forge::r-base=4.0.3 bioconda::bioconductor-bambu=1.0.2 bioconda::bioconductor-bsgenome=1.58.0" : null) - container "docker.io/yuukiiwa/nanoseq:bambu_bsgenome" + container "docker.io/yuukiiwa/nanoseq:bambu_bsgenome" //not on biocontainers; does not have a singularity container input: tuple path(fasta), path(gtf) @@ -32,10 +23,10 @@ process BAMBU { --fasta=$fasta $bams cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - bioconductor-deseq2: \$(Rscript -e "library(bambu); cat(as.character(packageVersion('bambu')))") - bioconductor-deseq2: \$(Rscript -e "library(BSgenome); cat(as.character(packageVersion('BSgenome')))") + bioconductor-bambu: \$(Rscript -e "library(bambu); cat(as.character(packageVersion('bambu')))") + bioconductor-bsgenome: \$(Rscript -e "library(BSgenome); cat(as.character(packageVersion('BSgenome')))") END_VERSIONS """ } diff --git a/modules/local/bedtools_bamtobed.nf b/modules/local/bedtools_bamtobed.nf index 349c50b5..e4d14fbc 100644 --- a/modules/local/bedtools_bamtobed.nf +++ b/modules/local/bedtools_bamtobed.nf @@ -1,18 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -// params.options = [:] -// def options = initOptions(params.options) - process BEDTOOLS_BAMBED { label 'process_medium' conda (params.enable_conda ? "bioconda::bedtools=2.29.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - } else { - container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0' : + 'quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0' }" when: !params.skip_alignment && !params.skip_bigbed && (params.protocol == 'directRNA' || params.protocol == 'cDNA') @@ -33,8 +25,8 @@ process BEDTOOLS_BAMBED { -i ${bam[0]} \\ | bedtools sort > ${meta.id}.bed12 cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(bedtools --version | sed -e "s/bedtools v//g") + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ } diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index 740f700a..6c510eb5 100644 --- a/modules/local/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -1,18 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -//params.options = [:] -//def options = initOptions(params.options) - process BEDTOOLS_GENOMECOV { label 'process_medium' conda (params.enable_conda ? "bioconda::bedtools=2.29.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0" - } else { - container "quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/bedtools:2.29.2--hc088bd4_0' : + 'quay.io/biocontainers/bedtools:2.29.2--hc088bd4_0' }" input: tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) @@ -31,8 +23,8 @@ process BEDTOOLS_GENOMECOV { -bg \\ | bedtools sort > ${meta.id}.bedGraph cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(bedtools --version | sed -e "s/bedtools v//g") + "${task.process}": + bedtools: \$(bedtools --version | sed -e "s/bedtools v//g") END_VERSIONS """ } diff --git a/modules/local/deseq2.nf b/modules/local/deseq2.nf index 97e5ef3c..d4c56330 100644 --- a/modules/local/deseq2.nf +++ b/modules/local/deseq2.nf @@ -1,22 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -params.multiqc_label = '' -def options = initOptions(params.options) - process DESEQ2 { label "process_medium" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } conda (params.enable_conda ? "conda-forge::r-base=4.0.3 bioconda::bioconductor-deseq2=1.28.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0" - } else { - container "quay.io/biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' : + 'quay.io/biocontainers/mulled-v2-8849acf39a43cdd6c839a369a74c0adc823e2f91:ab110436faf952a33575c64dd74615a84011450b-0' }" input: path counts @@ -30,7 +18,7 @@ process DESEQ2 { run_deseq2.r $params.quantification_method $counts cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') bioconductor-deseq2: \$(Rscript -e "library(DESeq2); cat(as.character(packageVersion('DESeq2')))") END_VERSIONS diff --git a/modules/local/dexseq.nf b/modules/local/dexseq.nf index e6b8a95b..f8bb0e00 100644 --- a/modules/local/dexseq.nf +++ b/modules/local/dexseq.nf @@ -1,15 +1,5 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -params.multiqc_label = '' -def options = initOptions(params.options) - process DEXSEQ { label "process_medium" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } conda (params.enable_conda ? "conda-forge::r-base=4.0.2 bioconda::bioconductor-dexseq=1.36.0 bioconda::bioconductor-drimseq=1.18.0 bioconda::bioconductor-stager=1.12.0" : null) container "docker.io/yuukiiwa/nanoseq:dexseq" @@ -23,18 +13,15 @@ process DEXSEQ { path "versions.yml" , emit: versions script: - def software = getSoftwareName(task.process) - def label_lower = params.multiqc_label.toLowerCase() - def label_upper = params.multiqc_label.toUpperCase() """ run_dexseq.r $params.quantification_method $counts cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": r-base: \$(echo \$(R --version 2>&1) | sed 's/^.*R version //; s/ .*\$//') - bioconductor-deseq2: \$(Rscript -e "library(DEXSeq); cat(as.character(packageVersion('DEXSeq')))") - bioconductor-deseq2: \$(Rscript -e "library(DRIMSeq); cat(as.character(packageVersion('DRIMSeq')))") - bioconductor-deseq2: \$(Rscript -e "library(stageR); cat(as.character(packageVersion('stageR')))") + bioconductor-dexseq: \$(Rscript -e "library(DEXSeq); cat(as.character(packageVersion('DEXSeq')))") + bioconductor-drimseq: \$(Rscript -e "library(DRIMSeq); cat(as.character(packageVersion('DRIMSeq')))") + bioconductor-stager: \$(Rscript -e "library(stageR); cat(as.character(packageVersion('stageR')))") END_VERSIONS """ } diff --git a/modules/local/functions.nf b/modules/local/functions.nf deleted file mode 100644 index 4860a362..00000000 --- a/modules/local/functions.nf +++ /dev/null @@ -1,75 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 596b7c47..5162d7e5 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -1,22 +1,9 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] - -/* - * Get chromosome sizes from a fasta file - */ process GET_CHROM_SIZES { -// publishDir "${params.outdir}", -// mode: params.publish_dir_mode, -// saveAs: { filename -> saveFiles(filename:filename, publish_dir:"genome") } conda (params.enable_conda ? "bioconda::samtools=1.10" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0' : + 'quay.io/biocontainers/samtools:1.13--h8c37831_0' }" input: tuple path(fasta), val(name) @@ -32,8 +19,8 @@ process GET_CHROM_SIZES { cut -f 1,2 ${fasta}.fai > ${fasta}.sizes cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/local/get_nanolyse_fasta.nf b/modules/local/get_nanolyse_fasta.nf index 2d87dbeb..34bc2d54 100644 --- a/modules/local/get_nanolyse_fasta.nf +++ b/modules/local/get_nanolyse_fasta.nf @@ -1,9 +1,3 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process GET_NANOLYSE_FASTA { conda (params.enable_conda ? "conda-forge::sed=4.7" : null) diff --git a/modules/local/get_software_versions.nf b/modules/local/get_software_versions.nf deleted file mode 100644 index 019d496e..00000000 --- a/modules/local/get_software_versions.nf +++ /dev/null @@ -1,33 +0,0 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - -process GET_SOFTWARE_VERSIONS { - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } - - cache false - - input: - path versions - - output: - path "software_versions.tsv" , emit: tsv - path 'software_versions_mqc.yaml', emit: yaml - - script: // This script is bundled with the pipeline, in nf-core/nanoseq/bin/ - """ - echo $workflow.manifest.version > pipeline.version.txt - echo $workflow.nextflow.version > nextflow.version.txt - scrape_software_versions.py &> software_versions_mqc.yaml - """ -} diff --git a/modules/local/get_test_data.nf b/modules/local/get_test_data.nf index 9d0b7ff9..a0b8f606 100644 --- a/modules/local/get_test_data.nf +++ b/modules/local/get_test_data.nf @@ -1,9 +1,3 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process GET_TEST_DATA { container "docker.io/yuukiiwa/git:latest" diff --git a/modules/local/graphmap2_align.nf b/modules/local/graphmap2_align.nf index 2efcb7a4..6bbf264a 100644 --- a/modules/local/graphmap2_align.nf +++ b/modules/local/graphmap2_align.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process GRAPHMAP2_ALIGN { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } conda (params.enable_conda ? "bioconda::graphmap=0.6.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/graphmap:0.6.3--he513fc3_0" - } else { - container "quay.io/biocontainers/graphmap:0.6.3--he513fc3_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/graphmap:0.6.3--he513fc3_0' : + 'quay.io/biocontainers/graphmap:0.6.3--he513fc3_0' }" input: tuple val(meta), path(fastq), path(fasta), path(sizes), val(gtf), val(bed), val(is_transcripts), path(index) @@ -41,8 +30,8 @@ process GRAPHMAP2_ALIGN { --extcigar cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(graphmap2 align 2>&1) | sed 's/^.*Version: v//; s/ .*\$//') + "${task.process}": + graphmap2: \$(echo \$(graphmap2 align 2>&1) | sed 's/^.*Version: v//; s/ .*\$//') END_VERSIONS """ } diff --git a/modules/local/graphmap2_index.nf b/modules/local/graphmap2_index.nf index 5df0495c..07d4a182 100644 --- a/modules/local/graphmap2_index.nf +++ b/modules/local/graphmap2_index.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process GRAPHMAP2_INDEX { label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } conda (params.enable_conda ? "bioconda::graphmap=0.6.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/graphmap:0.6.3--he513fc3_0" - } else { - container "quay.io/biocontainers/graphmap:0.6.3--he513fc3_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/graphmap:0.6.3--he513fc3_0' : + 'quay.io/biocontainers/graphmap:0.6.3--he513fc3_0' }" input: tuple path(fasta), path(sizes), val(gtf), val(bed), val(is_transcripts), val(annotation_str) @@ -37,8 +26,8 @@ process GRAPHMAP2_INDEX { -r $fasta cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(graphmap2 align 2>&1) | sed 's/^.*Version: v//; s/ .*\$//') + "${task.process}": + graphmap2: \$(echo \$(graphmap2 align 2>&1) | sed 's/^.*Version: v//; s/ .*\$//') END_VERSIONS """ } diff --git a/modules/local/gtf2bed.nf b/modules/local/gtf2bed.nf index 17b8fae5..b8918012 100644 --- a/modules/local/gtf2bed.nf +++ b/modules/local/gtf2bed.nf @@ -1,23 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] - -/* - * Convert GTF file to BED format - */ process GTF2BED { label 'process_low' -// publishDir "${params.outdir}", -// mode: params.publish_dir_mode, -// saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'genome', publish_id:'') } conda (params.enable_conda ? "conda-forge::perl=5.26.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/perl:5.26.2" - } else { - container "quay.io/biocontainers/perl:5.26.2" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/perl:5.26.2' : + 'quay.io/biocontainers/perl:5.26.2' }" input: tuple path(gtf), val(name) @@ -31,7 +18,7 @@ process GTF2BED { gtf2bed $gtf > ${gtf.baseName}.bed cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: + "${task.process}": perl: \$(echo \$(perl --version 2>&1) | sed 's/.*v\\(.*\\)) built.*/\\1/') END_VERSIONS """ diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index 04608dd3..4d839923 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -1,14 +1,5 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process GUPPY { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process)) } if (params.guppy_gpu) { container = 'genomicpariscentre/guppy-gpu:4.0.14' @@ -50,8 +41,8 @@ process GUPPY { $model cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') + "${task.process}": + guppy: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') END_VERSIONS ## Concatenate fastq files diff --git a/modules/local/medaka_variant.nf b/modules/local/medaka_variant.nf index 38f32d1b..5b7e75ed 100644 --- a/modules/local/medaka_variant.nf +++ b/modules/local/medaka_variant.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - -process MEDAKA { +process MEDAKA_VARIANT { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } conda (params.enable_conda ? "bioconda::medaka=1.4.4" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container 'https://depot.galaxyproject.org/singularity/medaka:1.4.4--py38h130def0_0' - } else { - container 'quay.io/biocontainers/medaka:1.4.4--py38h130def0_0' - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/medaka:1.4.4--py38h130def0_0' : + 'quay.io/biocontainers/medaka:1.4.4--py38h130def0_0' }" input: tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) // @@ -27,7 +16,7 @@ process MEDAKA { path "versions.yml" , emit: versions script: - def args = options.args ?: '' + //def args = options.args ?: '' def split_mnps = params.split_mnps ? "-l" : '' def phase_vcf = params.phase_vcf ? "-p" : '' """ @@ -39,7 +28,6 @@ process MEDAKA { -t $task.cpus \\ $split_mnps \\ $phase_vcf \\ - $args cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/minimap2_align.nf b/modules/local/minimap2_align.nf index 5c63ea7d..244a2b92 100644 --- a/modules/local/minimap2_align.nf +++ b/modules/local/minimap2_align.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process MINIMAP2_ALIGN { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'meta.id') } conda (params.enable_conda ? "bioconda::minimap2=2.17" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/minimap2:2.17--hed695b0_3" - } else { - container "quay.io/biocontainers/minimap2:2.17--hed695b0_3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/minimap2:2.17--hed695b0_3' : + 'quay.io/biocontainers/minimap2:2.17--hed695b0_3' }" input: tuple val(meta), path(fastq), path(fasta), path(sizes), val(gtf), val(bed), val(is_transcripts), path(index) @@ -43,8 +32,8 @@ process MINIMAP2_ALIGN { $fastq > ${meta.id}.sam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(minimap2 --version 2>&1) + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) END_VERSIONS """ } diff --git a/modules/local/minimap2_index.nf b/modules/local/minimap2_index.nf index dfe1af3f..fb63cac0 100644 --- a/modules/local/minimap2_index.nf +++ b/modules/local/minimap2_index.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process MINIMAP2_INDEX { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } conda (params.enable_conda ? "bioconda::minimap2=2.17" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/minimap2:2.17--hed695b0_3" - } else { - container "quay.io/biocontainers/minimap2:2.17--hed695b0_3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/minimap2:2.17--hed695b0_3' : + 'quay.io/biocontainers/minimap2:2.17--hed695b0_3' }" input: tuple path(fasta), path(sizes), val(gtf), val(bed), val(is_transcripts), val(annotation_str) @@ -40,8 +29,8 @@ process MINIMAP2_INDEX { $fasta cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(minimap2 --version 2>&1) + "${task.process}": + minimap2: \$(minimap2 --version 2>&1) END_VERSIONS """ } diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 2d595f63..44d8ca11 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -1,21 +1,10 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process MULTIQC { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } - conda (params.enable_conda ? "bioconda::multiqc=1.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.9--pyh9f0ad1d_0" - } else { - container "quay.io/biocontainers/multiqc:1.9--pyh9f0ad1d_0" - } + conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.10.1--pyhdfd78af_1' : + 'quay.io/biocontainers/multiqc:1.10.1--pyhdfd78af_1' }" input: path ch_multiqc_config @@ -35,13 +24,18 @@ process MULTIQC { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' def custom_config = params.multiqc_config ? "--config $multiqc_custom_config" : '' """ - multiqc -f . $custom_config + multiqc \\ + -f \\ + $args \\ + $custom_config \\ + . cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( multiqc --version | sed -e "s/multiqc, version //g" ) + "${task.process}": + multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) END_VERSIONS """ } diff --git a/modules/local/nanoplot.nf b/modules/local/nanoplot.nf new file mode 100644 index 00000000..6172371b --- /dev/null +++ b/modules/local/nanoplot.nf @@ -0,0 +1,41 @@ +process NANOPLOT { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? 'bioconda::nanoplot=1.38.0' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/nanoplot:1.38.0--pyhdfd78af_0' : + 'quay.io/biocontainers/nanoplot:1.38.0--pyhdfd78af_0' }" + + input: + tuple val(meta), path(ontfile) + + output: + tuple val(meta), path("$output_html"), emit: html + tuple val(meta), path("$output_png") , emit: png + tuple val(meta), path("$output_txt") , emit: txt + tuple val(meta), path("$output_log") , emit: log + path "versions.yml" , emit: versions + + script: + //def args = task.ext.args ?: '' + // $options.args \\ + def input_file = ("$ontfile".endsWith(".fastq.gz")) ? "--fastq ${ontfile}" : + ("$ontfile".endsWith(".txt")) ? "--summary ${ontfile}" : '' + def output_dir = ("$ontfile".endsWith(".fastq.gz")) ? "fastq/${meta.id}" : + ("$ontfile".endsWith(".txt")) ? "summary" : '' + output_html = output_dir+"/*.html" + output_png = output_dir+"/*.png" + output_txt = output_dir+"/*.txt" + output_log = output_dir+"/*.log" + """ + NanoPlot \\ + -t $task.cpus \\ + $input_file \\ + -o $output_dir + cat <<-END_VERSIONS > versions.yml + "${task.process}": + nanoplot: \$(echo \$(NanoPlot --version 2>&1) | sed 's/^.*NanoPlot //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/qcat.nf b/modules/local/qcat.nf index e9ec7d8f..fe2cbc07 100644 --- a/modules/local/qcat.nf +++ b/modules/local/qcat.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process QCAT { tag "$input_path" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:input_path) } conda (params.enable_conda ? "bioconda::qcat=1.1.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/qcat:1.1.0--py_0" - } else { - container "quay.io/biocontainers/qcat:1.1.0--py_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/qcat:1.1.0--py_0' : + 'quay.io/biocontainers/qcat:1.1.0--py_0' }" input: path input_path @@ -47,8 +36,8 @@ process QCAT { gzip fastq/* cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(qcat --version 2>&1 | sed 's/^.*qcat //; s/ .*\$//') + "${task.process}": + qcat: \$(qcat --version 2>&1 | sed 's/^.*qcat //; s/ .*\$//') END_VERSIONS """ } diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 8d74185d..9aaecf0c 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -1,31 +1,27 @@ -// Import generic module functions -include { saveFiles } from './functions' - -params.options = [:] - process SAMPLESHEET_CHECK { tag "$samplesheet" - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "conda-forge::python=3.8.3" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/python:3.8.3" - } else { - container "quay.io/biocontainers/python:3.8.3" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/python:3.8.3' : + 'quay.io/biocontainers/python:3.8.3' }" input: path samplesheet output: - path '*.csv' + path '*.csv' , emit: csv + path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/nanoseq/bin/ """ check_samplesheet.py \\ $samplesheet \\ samplesheet.valid.csv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + python: \$(python --version | sed 's/Python //g') + END_VERSIONS """ } diff --git a/modules/local/samtools_sort_index.nf b/modules/local/samtools_sort_index.nf index f16c2906..619f0158 100644 --- a/modules/local/samtools_sort_index.nf +++ b/modules/local/samtools_sort_index.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process SAMTOOLS_SORT_INDEX { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::samtools=1.14" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0" - } else { - container "quay.io/biocontainers/samtools:1.14--hb421002_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam) @@ -27,15 +16,14 @@ process SAMTOOLS_SORT_INDEX { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" """ - samtools sort $options.args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam + samtools sort -@ $task.cpus -o ${meta.id}.sorted.bam -T $meta.id $bam - samtools index $options.args ${prefix}.sorted.bam + samtools index ${meta.id}.sorted.bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/local/samtools_view_bam.nf b/modules/local/samtools_view_bam.nf index 5982ebfa..791b0143 100644 --- a/modules/local/samtools_view_bam.nf +++ b/modules/local/samtools_view_bam.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process SAMTOOLS_VIEW_BAM { tag "$meta.id" label 'process_medium' -// publishDir "${params.outdir}", -// mode: params.publish_dir_mode, -// saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'meta.id') } conda (params.enable_conda ? "bioconda::samtools=1.10" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.11--h6270b1f_0" - } else { - container "quay.io/biocontainers/samtools:1.11--h6270b1f_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(sizes), val(is_transcripts), path(sam) @@ -30,8 +19,8 @@ process SAMTOOLS_VIEW_BAM { samtools view -b -h -O BAM -@ $task.cpus -o ${meta.id}.bam $sam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } diff --git a/modules/local/sniffles.nf b/modules/local/sniffles.nf index 317eede5..a54addeb 100644 --- a/modules/local/sniffles.nf +++ b/modules/local/sniffles.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process SNIFFLES { tag "$meta.id" label 'process_high' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } conda (params.enable_conda ? "bioconda::sniffles=1.0.12" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container 'https://depot.galaxyproject.org/singularity/sniffles:1.0.12--h8b12597_1' - } else { - container 'quay.io/biocontainers/sniffles:1.0.12--h8b12597_1' - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sniffles:1.0.12--h8b12597_1' : + 'quay.io/biocontainers/sniffles:1.0.12--h8b12597_1' }" input: tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) @@ -35,8 +24,8 @@ process SNIFFLES { -t $task.cpus cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") + "${task.process}": + sniffles: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") //need sniffles's version END_VERSIONS """ } diff --git a/modules/local/stringtie2.nf b/modules/local/stringtie2.nf index 322eadf0..2493fdb9 100644 --- a/modules/local/stringtie2.nf +++ b/modules/local/stringtie2.nf @@ -1,23 +1,12 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process STRINGTIE2 { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } // Note: 2.7X indices incompatible with AWS iGenomes. conda (params.enable_conda ? "bioconda::stringtie=2.1.4" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/stringtie:2.1.4--h7e0af3c_0" - } else { - container "quay.io/biocontainers/stringtie:2.1.4--h7e0af3c_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/stringtie:2.1.4--h7e0af3c_0' : + 'quay.io/biocontainers/stringtie:2.1.4--h7e0af3c_0' }" input: tuple val(meta), path(fasta), path(gtf), path(bam) @@ -34,8 +23,8 @@ process STRINGTIE2 { -o ${meta.id}.stringtie.gtf $bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(stringtie --version 2>&1) + "${task.process}": + stringtie2: \$(stringtie --version 2>&1) END_VERSIONS """ } diff --git a/modules/local/subread_featurecounts.nf b/modules/local/subread_featurecounts.nf index fa722727..a00b0f73 100644 --- a/modules/local/subread_featurecounts.nf +++ b/modules/local/subread_featurecounts.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - process SUBREAD_FEATURECOUNTS { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'') } // Note: 2.7X indices incompatible with AWS iGenomes. conda (params.enable_conda ? "bioconda::subread=2.0.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0" - } else { - container "quay.io/biocontainers/subread:2.0.1--hed695b0_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/subread:2.0.1--hed695b0_0' : + 'quay.io/biocontainers/subread:2.0.1--hed695b0_0' }" input: path gtf @@ -58,8 +47,8 @@ process SUBREAD_FEATURECOUNTS { $bams cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") + "${task.process}": + featureCounts: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") END_VERSIONS """ } diff --git a/modules/local/ucsc_bed12tobigbed.nf b/modules/local/ucsc_bed12tobigbed.nf index 6f31caef..e8f20075 100644 --- a/modules/local/ucsc_bed12tobigbed.nf +++ b/modules/local/ucsc_bed12tobigbed.nf @@ -1,24 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - -def VERSION = '377' - process UCSC_BED12TOBIGBED { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'bigBed', publish_id:'meta.id') } conda (params.enable_conda ? "bioconda::ucsc-bedtobigbed=377" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/ucsc-bedtobigbed:377--h446ed27_1" - } else { - container "quay.io/biocontainers/ucsc-bedtobigbed:377--h446ed27_1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ucsc-bedtobigbed:377--h446ed27_1' : + 'quay.io/biocontainers/ucsc-bedtobigbed:377--h446ed27_1' }" when: !params.skip_alignment && !params.skip_bigbed && (params.protocol == 'directRNA' || params.protocol == 'cDNA') @@ -31,6 +18,7 @@ process UCSC_BED12TOBIGBED { path "versions.yml" , emit: versions script: + def VERSION = '377' """ bedToBigBed \\ $bed12 \\ @@ -38,8 +26,8 @@ process UCSC_BED12TOBIGBED { ${meta.id}.bigBed cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo $VERSION) + "${task.process}": + ucsc_bed12tobigbed: \$(echo $VERSION) END_VERSIONS """ } diff --git a/modules/local/ucsc_bedgraphtobigwig.nf b/modules/local/ucsc_bedgraphtobigwig.nf index 28622203..41d4eb81 100644 --- a/modules/local/ucsc_bedgraphtobigwig.nf +++ b/modules/local/ucsc_bedgraphtobigwig.nf @@ -1,24 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -// def options = initOptions(params.options) //this line gives "Cannot get property 'args' on null object" - -def VERSION = '377' - process UCSC_BEDGRAPHTOBIGWIG { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:'meta.id') } conda (params.enable_conda ? "bioconda::ucsc-bedgraphtobigwig=377" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1" - } else { - container "quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/ucsc-bedgraphtobigwig:377--h446ed27_1' : + 'quay.io/biocontainers/ucsc-bedgraphtobigwig:377--h446ed27_1' }" input: tuple val(meta), path(sizes), path(bedgraph) @@ -28,12 +15,13 @@ process UCSC_BEDGRAPHTOBIGWIG { path "versions.yml" , emit: versions script: + def VERSION = '377' """ bedGraphToBigWig $bedgraph $sizes ${meta.id}.bigWig cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo $VERSION) + "${task.process}": + ucsc_bedgraphtobigwig: \$(echo $VERSION) END_VERSIONS """ } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index faf2073f..934bb467 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process CUSTOM_DUMPSOFTWAREVERSIONS { label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:'pipeline_info', meta:[:], publish_by_meta:[]) } // Requires `pyyaml` which does not have a dedicated container but is in the MultiQC container conda (params.enable_conda ? "bioconda::multiqc=1.11" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0" - } else { - container "quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path versions @@ -27,80 +16,6 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "versions.yml" , emit: versions script: - """ - #!/usr/bin/env python - - import yaml - import platform - from textwrap import dedent - - def _make_versions_html(versions): - html = [ - dedent( - '''\\ - - - - - - - - - - ''' - ) - ] - for process, tmp_versions in sorted(versions.items()): - html.append("") - for i, (tool, version) in enumerate(sorted(tmp_versions.items())): - html.append( - dedent( - f'''\\ - - - - - - ''' - ) - ) - html.append("") - html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") - return "\\n".join(html) - - module_versions = {} - module_versions["${getProcessName(task.process)}"] = { - 'python': platform.python_version(), - 'yaml': yaml.__version__ - } - - with open("$versions") as f: - workflow_versions = yaml.load(f, Loader=yaml.BaseLoader) | module_versions - - workflow_versions["Workflow"] = { - "Nextflow": "$workflow.nextflow.version", - "$workflow.manifest.name": "$workflow.manifest.version" - } - - versions_mqc = { - 'id': 'software_versions', - 'section_name': '${workflow.manifest.name} Software Versions', - 'section_href': 'https://github.com/${workflow.manifest.name}', - 'plot_type': 'html', - 'description': 'are collected at run time from the software output.', - 'data': _make_versions_html(workflow_versions) - } - - with open("software_versions.yml", 'w') as f: - yaml.dump(workflow_versions, f, default_flow_style=False) - with open("software_versions_mqc.yml", 'w') as f: - yaml.dump(versions_mqc, f, default_flow_style=False) - - with open('versions.yml', 'w') as f: - yaml.dump(module_versions, f, default_flow_style=False) - """ + def args = task.ext.args ?: '' + template 'dumpsoftwareversions.py' } diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index c8310e35..5b5b8a60 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -31,3 +31,4 @@ output: authors: - "@drpatelh" + - "@grst" diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py new file mode 100644 index 00000000..d1390392 --- /dev/null +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/templates/dumpsoftwareversions.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python + +import yaml +import platform +from textwrap import dedent + + +def _make_versions_html(versions): + html = [ + dedent( + """\\ + + + + + + + + + + """ + ) + ] + for process, tmp_versions in sorted(versions.items()): + html.append("") + for i, (tool, version) in enumerate(sorted(tmp_versions.items())): + html.append( + dedent( + f"""\\ + + + + + + """ + ) + ) + html.append("") + html.append("
Process Name Software Version
{process if (i == 0) else ''}{tool}{version}
") + return "\\n".join(html) + + +versions_this_module = {} +versions_this_module["${task.process}"] = { + "python": platform.python_version(), + "yaml": yaml.__version__, +} + +with open("$versions") as f: + versions_by_process = yaml.load(f, Loader=yaml.BaseLoader) | versions_this_module + +# aggregate versions by the module name (derived from fully-qualified process name) +versions_by_module = {} +for process, process_versions in versions_by_process.items(): + module = process.split(":")[-1] + try: + assert versions_by_module[module] == process_versions, ( + "We assume that software versions are the same between all modules. " + "If you see this error-message it means you discovered an edge-case " + "and should open an issue in nf-core/tools. " + ) + except KeyError: + versions_by_module[module] = process_versions + +versions_by_module["Workflow"] = { + "Nextflow": "$workflow.nextflow.version", + "$workflow.manifest.name": "$workflow.manifest.version", +} + +versions_mqc = { + "id": "software_versions", + "section_name": "${workflow.manifest.name} Software Versions", + "section_href": "https://github.com/${workflow.manifest.name}", + "plot_type": "html", + "description": "are collected at run time from the software output.", + "data": _make_versions_html(versions_by_module), +} + +with open("software_versions.yml", "w") as f: + yaml.dump(versions_by_module, f, default_flow_style=False) +with open("software_versions_mqc.yml", "w") as f: + yaml.dump(versions_mqc, f, default_flow_style=False) + +with open("versions.yml", "w") as f: + yaml.dump(versions_this_module, f, default_flow_style=False) diff --git a/modules/nf-core/modules/fastqc/functions.nf b/modules/nf-core/modules/fastqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/fastqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index 39c327b2..d250eca0 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process FASTQC { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::fastqc=0.11.9" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0" - } else { - container "quay.io/biocontainers/fastqc:0.11.9--0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/fastqc:0.11.9--0' : + 'quay.io/biocontainers/fastqc:0.11.9--0' }" input: tuple val(meta), path(reads) @@ -24,24 +13,32 @@ process FASTQC { output: tuple val(meta), path("*.html"), emit: html tuple val(meta), path("*.zip") , emit: zip - path "*.version.txt" , emit: version + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline - def software = getSoftwareName(task.process) - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def prefix = task.ext.prefix ?: "${meta.id}" if (meta.single_end) { """ [ ! -f ${prefix}.fastq.gz ] && ln -s $reads ${prefix}.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } else { """ [ ! -f ${prefix}_1.fastq.gz ] && ln -s ${reads[0]} ${prefix}_1.fastq.gz [ ! -f ${prefix}_2.fastq.gz ] && ln -s ${reads[1]} ${prefix}_2.fastq.gz - fastqc $options.args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz - fastqc --version | sed -e "s/FastQC v//g" > ${software}.version.txt + fastqc $args --threads $task.cpus ${prefix}_1.fastq.gz ${prefix}_2.fastq.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS """ } } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index 8eb9953d..b09553a3 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -15,6 +15,7 @@ tools: overrepresented sequences. homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ['GPL-2.0-only'] input: - meta: type: map @@ -40,10 +41,10 @@ output: type: file description: FastQC report archive pattern: "*_{fastqc.zip}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@grst" diff --git a/modules/nf-core/modules/multiqc/functions.nf b/modules/nf-core/modules/multiqc/functions.nf deleted file mode 100644 index da9da093..00000000 --- a/modules/nf-core/modules/multiqc/functions.nf +++ /dev/null @@ -1,68 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - if (!args.filename.endsWith('.version.txt')) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } - } -} diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf deleted file mode 100644 index da780800..00000000 --- a/modules/nf-core/modules/multiqc/main.nf +++ /dev/null @@ -1,35 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process MULTIQC { - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } - - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/multiqc:1.10.1--py_0" - } else { - container "quay.io/biocontainers/multiqc:1.10.1--py_0" - } - - input: - path multiqc_files - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "*.version.txt" , emit: version - - script: - def software = getSoftwareName(task.process) - """ - multiqc -f $options.args . - multiqc --version | sed -e "s/multiqc, version //g" > ${software}.version.txt - """ -} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml deleted file mode 100644 index 532a8bb1..00000000 --- a/modules/nf-core/modules/multiqc/meta.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: MultiQC -description: Aggregate results from bioinformatics analyses across many samples into a single report -keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report -tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ -input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC -output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - version: - type: file - description: File containing software version - pattern: "*.{version.txt}" -authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" diff --git a/modules/nf-core/modules/nanolyse/functions.nf b/modules/nf-core/modules/nanolyse/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/nanolyse/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/nanolyse/main.nf b/modules/nf-core/modules/nanolyse/main.nf index 271592f7..c52d9e9d 100644 --- a/modules/nf-core/modules/nanolyse/main.nf +++ b/modules/nf-core/modules/nanolyse/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process NANOLYSE { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } conda (params.enable_conda ? "bioconda::nanolyse=1.2.0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/nanolyse:1.2.0--py_0" - } else { - container "quay.io/biocontainers/nanolyse:1.2.0--py_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/nanolyse:1.2.0--py_0' : + 'quay.io/biocontainers/nanolyse:1.2.0--py_0' }" input: tuple val(meta), path(fastq) @@ -28,14 +17,15 @@ process NANOLYSE { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ gunzip -c $fastq | NanoLyse -r $fasta | gzip > ${prefix}.fastq.gz mv NanoLyse.log ${prefix}.nanolyse.log - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(NanoLyse --version 2>&1 | sed -e "s/NanoLyse //g") + "${task.process}": + nanolyse: \$(NanoLyse --version 2>&1 | sed -e "s/NanoLyse //g") END_VERSIONS """ } + diff --git a/modules/nf-core/modules/nanoplot/functions.nf b/modules/nf-core/modules/nanoplot/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/nanoplot/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/nanoplot/main.nf b/modules/nf-core/modules/nanoplot/main.nf deleted file mode 100644 index cce9e036..00000000 --- a/modules/nf-core/modules/nanoplot/main.nf +++ /dev/null @@ -1,51 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - -process NANOPLOT { - tag "$meta.id" - label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - - conda (params.enable_conda ? 'bioconda::nanoplot=1.38.0' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/nanoplot:1.38.0--pyhdfd78af_0" - } else { - container "quay.io/biocontainers/nanoplot:1.38.0--pyhdfd78af_0" - } - - input: - tuple val(meta), path(ontfile) - - output: - tuple val(meta), path("$output_html"), emit: html - tuple val(meta), path("$output_png") , emit: png - tuple val(meta), path("$output_txt") , emit: txt - tuple val(meta), path("$output_log") , emit: log - path "versions.yml" , emit: versions - - script: - def input_file = ("$ontfile".endsWith(".fastq.gz")) ? "--fastq ${ontfile}" : - ("$ontfile".endsWith(".txt")) ? "--summary ${ontfile}" : '' - def output_dir = ("$ontfile".endsWith(".fastq.gz")) ? "fastq/${meta.id}" : - ("$ontfile".endsWith(".txt")) ? "summary" : '' - output_html = output_dir+"/*.html" - output_png = output_dir+"/*.png" - output_txt = output_dir+"/*.txt" - output_log = output_dir+"/*.log" - """ - NanoPlot \\ - $options.args \\ - -t $task.cpus \\ - $input_file \\ - -o $output_dir - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(NanoPlot --version 2>&1) | sed 's/^.*NanoPlot //; s/ .*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/nanoplot/meta.yml b/modules/nf-core/modules/nanoplot/meta.yml deleted file mode 100644 index 52ebb622..00000000 --- a/modules/nf-core/modules/nanoplot/meta.yml +++ /dev/null @@ -1,59 +0,0 @@ -name: nanoplot -description: Run NanoPlot on nanopore-sequenced reads -keywords: - - quality control - - qc - - fastq - - sequencing summary - - nanopore -tools: - - nanoplot: - description: | - NanoPlot is a tool for ploting long-read sequencing data and - alignment. - homepage: http://nanoplot.bioinf.be - documentation: https://github.com/wdecoster/NanoPlot - licence: ['GPL-3.0-or-later'] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fastq: - type: file - description: | - List of input basecalled-FastQ files. - - summary_txt: - type: file - description: | - List of sequencing_summary.txt files from running basecalling. -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: NanoPlot report - pattern: "*{.html}" - - png: - type: file - description: Plots generated by NanoPlot - pattern: "*{.png}" - - txt: - type: file - description: Stats from NanoPlot - pattern: "*{.txt}" - - log: - type: file - description: log file of NanoPlot run - pattern: "*{.log}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@yuukiiwa" diff --git a/modules/nf-core/modules/pycoqc/functions.nf b/modules/nf-core/modules/pycoqc/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/pycoqc/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/pycoqc/main.nf b/modules/nf-core/modules/pycoqc/main.nf index 2c263d61..ab18a3fc 100644 --- a/modules/nf-core/modules/pycoqc/main.nf +++ b/modules/nf-core/modules/pycoqc/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process PYCOQC { tag "$summary" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } conda (params.enable_conda ? "bioconda::pycoqc=2.5.2" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/pycoqc:2.5.2--py_0" - } else { - container "quay.io/biocontainers/pycoqc:2.5.2--py_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/pycoqc:2.5.2--py_0' : + 'quay.io/biocontainers/pycoqc:2.5.2--py_0' }" input: path summary @@ -27,16 +16,17 @@ process PYCOQC { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ pycoQC \\ - $options.args \\ + $args \\ -f $summary \\ -o pycoqc.html \\ -j pycoqc.json - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(pycoQC --version 2>&1 | sed 's/^.*pycoQC v//; s/ .*\$//') + "${task.process}": + pycoqc: \$(pycoQC --version 2>&1 | sed 's/^.*pycoQC v//; s/ .*\$//') END_VERSIONS """ } + diff --git a/modules/nf-core/modules/samtools/flagstat/functions.nf b/modules/nf-core/modules/samtools/flagstat/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/flagstat/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/flagstat/main.nf b/modules/nf-core/modules/samtools/flagstat/main.nf index f9115c6b..2b62e31e 100644 --- a/modules/nf-core/modules/samtools/flagstat/main.nf +++ b/modules/nf-core/modules/samtools/flagstat/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_FLAGSTAT { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam), path(bai) @@ -26,11 +15,13 @@ process SAMTOOLS_FLAGSTAT { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ - samtools flagstat $bam > ${bam}.flagstat + samtools flagstat --threads ${task.cpus-1} $bam > ${bam}.flagstat cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } + diff --git a/modules/nf-core/modules/samtools/flagstat/meta.yml b/modules/nf-core/modules/samtools/flagstat/meta.yml index 6703c392..adb182e9 100644 --- a/modules/nf-core/modules/samtools/flagstat/meta.yml +++ b/modules/nf-core/modules/samtools/flagstat/meta.yml @@ -16,22 +16,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 -params: - - outdir: - type: string - description: | - The pipeline's output directory. By default, the module will - output files into `$params.outdir/` - - publish_dir_mode: - type: string - description: | - Value for the Nextflow `publishDir` mode parameter. - Available: symlink, rellink, link, copy, copyNoFollow, move. - - enable_conda: - type: boolean - description: | - Run the module with Conda using the software specified - via the `conda` directive + licence: ['MIT'] input: - meta: type: map @@ -56,9 +41,10 @@ output: type: file description: File containing samtools flagstat output pattern: "*.{flagstat}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" + diff --git a/modules/nf-core/modules/samtools/idxstats/functions.nf b/modules/nf-core/modules/samtools/idxstats/functions.nf deleted file mode 100644 index ce468a6f..00000000 --- a/modules/nf-core/modules/samtools/idxstats/functions.nf +++ /dev/null @@ -1,79 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} - diff --git a/modules/nf-core/modules/samtools/idxstats/main.nf b/modules/nf-core/modules/samtools/idxstats/main.nf index b005088a..e4c6623e 100644 --- a/modules/nf-core/modules/samtools/idxstats/main.nf +++ b/modules/nf-core/modules/samtools/idxstats/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_IDXSTATS { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam), path(bai) @@ -26,11 +15,13 @@ process SAMTOOLS_IDXSTATS { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ samtools idxstats $bam > ${bam}.idxstats cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } + diff --git a/modules/nf-core/modules/samtools/idxstats/meta.yml b/modules/nf-core/modules/samtools/idxstats/meta.yml index c33f1724..334a1d51 100644 --- a/modules/nf-core/modules/samtools/idxstats/meta.yml +++ b/modules/nf-core/modules/samtools/idxstats/meta.yml @@ -17,22 +17,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 -params: - - outdir: - type: string - description: | - The pipeline's output directory. By default, the module will - output files into `$params.outdir/` - - publish_dir_mode: - type: string - description: | - Value for the Nextflow `publishDir` mode parameter. - Available: symlink, rellink, link, copy, copyNoFollow, move. - - enable_conda: - type: boolean - description: | - Run the module with Conda using the software specified - via the `conda` directive + licence: ['MIT'] input: - meta: type: map @@ -57,9 +42,10 @@ output: type: file description: File containing samtools idxstats output pattern: "*.{idxstats}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" + diff --git a/modules/nf-core/modules/samtools/index/functions.nf b/modules/nf-core/modules/samtools/index/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/index/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index febbc11c..eb79d3d3 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -1,37 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: - tuple val(meta), path(bam) + tuple val(meta), path(input) output: - tuple val(meta), path("*.bai"), optional:true, emit: bai - tuple val(meta), path("*.csi"), optional:true, emit: csi - path "versions.yml" , emit: versions + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ - samtools index $options.args $bam + samtools index -@ ${task.cpus-1} $args $input cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } + diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index 8d3e049c..c4d2da1c 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -14,22 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 -params: - - outdir: - type: string - description: | - The pipeline's output directory. By default, the module will - output files into `$params.outdir/` - - publish_dir_mode: - type: string - description: | - Value for the Nextflow `publishDir` mode parameter. - Available: symlink, rellink, link, copy, copyNoFollow, move. - - enable_conda: - type: boolean - description: | - Run the module with Conda using the software specified - via the `conda` directive + licence: ['MIT'] input: - meta: type: map @@ -50,10 +35,20 @@ output: type: file description: BAM/CRAM/SAM index file pattern: "*.{bai,crai,sai}" - - version: + - crai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - csi: + type: file + description: CSI index file + pattern: "*.{csi}" + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@ewels" + - "@maxulysse" + diff --git a/modules/nf-core/modules/samtools/sort/functions.nf b/modules/nf-core/modules/samtools/sort/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/sort/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index bfe8d8a1..ad981e0c 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: tuple val(meta), path(bam) @@ -26,12 +15,14 @@ process SAMTOOLS_SORT { path "versions.yml" , emit: versions script: - def prefix = options.suffix ? "${meta.id}${options.suffix}" : "${meta.id}" + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" """ - samtools sort $options.args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam + samtools sort $args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } + diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml index e8f74b26..78431457 100644 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -14,22 +14,7 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 -params: - - outdir: - type: string - description: | - The pipeline's output directory. By default, the module will - output files into `$params.outdir/` - - publish_dir_mode: - type: string - description: | - Value for the Nextflow `publishDir` mode parameter. - Available: symlink, rellink, link, copy, copyNoFollow, move. - - enable_conda: - type: boolean - description: | - Run the module with Conda using the software specified - via the `conda` directive + licence: ['MIT'] input: - meta: type: map @@ -50,10 +35,11 @@ output: type: file description: Sorted BAM/CRAM/SAM file pattern: "*.{bam,cram,sam}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" - "@ewels" + diff --git a/modules/nf-core/modules/samtools/stats/functions.nf b/modules/nf-core/modules/samtools/stats/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/samtools/stats/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 6218dd2d..596197c0 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -1,36 +1,29 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process SAMTOOLS_STATS { tag "$meta.id" label 'process_low' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:meta, publish_by_meta:['id']) } - conda (params.enable_conda ? 'bioconda::samtools=1.13' : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0" - } else { - container "quay.io/biocontainers/samtools:1.13--h8c37831_0" - } + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" input: - tuple val(meta), path(bam), path(bai) + tuple val(meta), path(input), path(input_index) + //path fasta output: tuple val(meta), path("*.stats"), emit: stats path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' + //def reference = fasta ? "--reference ${fasta}" : "" """ - samtools stats $bam > ${bam}.stats + samtools stats --threads ${task.cpus-1} ${input} > ${input}.stats cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } + diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index 9f478cc0..de9ab166 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -15,36 +15,25 @@ tools: homepage: http://www.htslib.org/ documentation: hhttp://www.htslib.org/doc/samtools.html doi: 10.1093/bioinformatics/btp352 -params: - - outdir: - type: string - description: | - The pipeline's output directory. By default, the module will - output files into `$params.outdir/` - - publish_dir_mode: - type: string - description: | - Value for the Nextflow `publishDir` mode parameter. - Available: symlink, rellink, link, copy, copyNoFollow, move. - - enable_conda: - type: boolean - description: | - Run the module with Conda using the software specified - via the `conda` directive + licence: ['MIT'] input: - meta: type: map description: | Groovy Map containing sample information e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" output: - meta: type: map @@ -55,9 +44,11 @@ output: type: file description: File containing samtools stats output pattern: "*.{stats}" - - version: + - versions: type: file - description: File containing software version - pattern: "*.{version.txt}" + description: File containing software versions + pattern: "versions.yml" authors: - "@drpatelh" + - "@FriederikeHanssen" + diff --git a/modules/nf-core/modules/stringtie/merge/functions.nf b/modules/nf-core/modules/stringtie/merge/functions.nf deleted file mode 100644 index 85628ee0..00000000 --- a/modules/nf-core/modules/stringtie/merge/functions.nf +++ /dev/null @@ -1,78 +0,0 @@ -// -// Utility functions used in nf-core DSL2 module files -// - -// -// Extract name of software tool from process name using $task.process -// -def getSoftwareName(task_process) { - return task_process.tokenize(':')[-1].tokenize('_')[0].toLowerCase() -} - -// -// Extract name of module from process name using $task.process -// -def getProcessName(task_process) { - return task_process.tokenize(':')[-1] -} - -// -// Function to initialise default values and to generate a Groovy Map of available options for nf-core modules -// -def initOptions(Map args) { - def Map options = [:] - options.args = args.args ?: '' - options.args2 = args.args2 ?: '' - options.args3 = args.args3 ?: '' - options.publish_by_meta = args.publish_by_meta ?: [] - options.publish_dir = args.publish_dir ?: '' - options.publish_files = args.publish_files - options.suffix = args.suffix ?: '' - return options -} - -// -// Tidy up and join elements of a list to return a path string -// -def getPathFromList(path_list) { - def paths = path_list.findAll { item -> !item?.trim().isEmpty() } // Remove empty entries - paths = paths.collect { it.trim().replaceAll("^[/]+|[/]+\$", "") } // Trim whitespace and trailing slashes - return paths.join('/') -} - -// -// Function to save/publish module results -// -def saveFiles(Map args) { - def ioptions = initOptions(args.options) - def path_list = [ ioptions.publish_dir ?: args.publish_dir ] - - // Do not publish versions.yml unless running from pytest workflow - if (args.filename.equals('versions.yml') && !System.getenv("NF_CORE_MODULES_TEST")) { - return null - } - if (ioptions.publish_by_meta) { - def key_list = ioptions.publish_by_meta instanceof List ? ioptions.publish_by_meta : args.publish_by_meta - for (key in key_list) { - if (args.meta && key instanceof String) { - def path = key - if (args.meta.containsKey(key)) { - path = args.meta[key] instanceof Boolean ? "${key}_${args.meta[key]}".toString() : args.meta[key] - } - path = path instanceof String ? path : '' - path_list.add(path) - } - } - } - if (ioptions.publish_files instanceof Map) { - for (ext in ioptions.publish_files) { - if (args.filename.endsWith(ext.key)) { - def ext_list = path_list.collect() - ext_list.add(ext.value) - return "${getPathFromList(ext_list)}/$args.filename" - } - } - } else if (ioptions.publish_files == null) { - return "${getPathFromList(path_list)}/$args.filename" - } -} diff --git a/modules/nf-core/modules/stringtie/merge/main.nf b/modules/nf-core/modules/stringtie/merge/main.nf index 371533bb..82e5ea58 100644 --- a/modules/nf-core/modules/stringtie/merge/main.nf +++ b/modules/nf-core/modules/stringtie/merge/main.nf @@ -1,22 +1,11 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' - -params.options = [:] -options = initOptions(params.options) - process STRINGTIE_MERGE { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), meta:[:], publish_by_meta:[]) } // Note: 2.7X indices incompatible with AWS iGenomes. conda (params.enable_conda ? "bioconda::stringtie=2.1.7" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/stringtie:2.1.7--h978d192_0" - } else { - container "quay.io/biocontainers/stringtie:2.1.7--h978d192_0" - } + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/stringtie:2.1.7--h978d192_0' : + 'quay.io/biocontainers/stringtie:2.1.7--h978d192_0' }" input: path stringtie_gtf @@ -27,15 +16,16 @@ process STRINGTIE_MERGE { path "versions.yml" , emit: versions script: + def args = task.ext.args ?: '' """ stringtie \\ --merge $stringtie_gtf \\ -G $annotation_gtf \\ -o stringtie.merged.gtf - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(stringtie --version 2>&1) + "${task.process}": + stringtie: \$(stringtie --version 2>&1) END_VERSIONS """ } + diff --git a/nextflow.config b/nextflow.config index 26d0188f..ef2ce0d0 100644 --- a/nextflow.config +++ b/nextflow.config @@ -70,7 +70,6 @@ params { // Options: Custom config custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - hostnames = [:] config_profile_description = null config_profile_contact = null config_profile_url = null @@ -78,12 +77,10 @@ params { // Options: Other help = false outdir = './results' - enable_conda = false - publish_dir_mode = 'copy' - igenomes_base = 's3://ngi-igenomes/igenomes/' - igenomes_ignore = false - max_multiqc_email_size = '25.MB' - multiqc_title = null + igenomes_base = 's3://ngi-igenomes/igenomes/' //note + igenomes_ignore = false //note + max_multiqc_email_size = '25.MB' //note + multiqc_title = null //note tracedir = "${params.outdir}/pipeline_info" email = null email_on_fail = null @@ -92,14 +89,12 @@ params { help = false validate_params = true show_hidden_params = false - schema_ignore_params = 'genomes,modules' + schema_ignore_params = 'genomes' enable_conda = false - singularity_pull_docker_container = false // Config options custom_config_version = 'master' custom_config_base = "https://raw.githubusercontent.com/nf-core/configs/${params.custom_config_version}" - hostnames = [:] config_profile_description = null config_profile_contact = null config_profile_url = null @@ -115,9 +110,6 @@ params { // Load base.config by default for all pipelines includeConfig 'conf/base.config' -// Load modules.config for DSL2 module specific options -includeConfig 'conf/modules.config' - // Load nf-core custom profiles from different Institutions try { includeConfig "${params.custom_config_base}/nfcore_custom.config" @@ -125,13 +117,6 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -188,11 +173,22 @@ profiles { test_nobc_nodx_vc { includeConfig 'conf/test_nobc_nodx_vc.config' } } +// Load igenomes.config if required +if (!params.igenomes_ignore) { + includeConfig 'conf/igenomes.config' +} else { + params.genomes = [:] +} + // Export these variables to prevent local Python/R libraries from conflicting with those in the container +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. + env { PYTHONNOUSERSITE = 1 R_PROFILE_USER = "/.Rprofile" R_ENVIRON_USER = "/.Renviron" + JULIA_DEPOT_PATH = "/usr/local/share/julia" } // Capture exit codes from upstream processes when piping @@ -222,10 +218,13 @@ manifest { homePage = 'https://github.com/nf-core/nanoseq' description = 'A pipeline to demultiplex, QC and map Nanopore data' mainScript = 'main.nf' - nextflowVersion = '!>=21.04.0' + nextflowVersion = '!>=21.10.3' version = '2.0.1' } +// Load modules.config for DSL2 module specific options +includeConfig 'conf/modules.config' + // Function to ensure that resource requirements don't go beyond // a maximum limit def check_max(obj, type) { diff --git a/subworkflows/local/align_graphmap2.nf b/subworkflows/local/align_graphmap2.nf index 6723214e..7b175c17 100644 --- a/subworkflows/local/align_graphmap2.nf +++ b/subworkflows/local/align_graphmap2.nf @@ -2,12 +2,8 @@ * Alignment with GRAPHMAP2 */ -params.index_options = [:] -params.align_options = [:] -params.samtools_options = [:] - -include { GRAPHMAP2_INDEX } from '../../modules/local/graphmap2_index' addParams( options: params.index_options ) -include { GRAPHMAP2_ALIGN } from '../../modules/local/graphmap2_align' addParams( options: params.align_options ) +include { GRAPHMAP2_INDEX } from '../../modules/local/graphmap2_index' +include { GRAPHMAP2_ALIGN } from '../../modules/local/graphmap2_align' workflow ALIGN_GRAPHMAP2 { take: diff --git a/subworkflows/local/align_minimap2.nf b/subworkflows/local/align_minimap2.nf index 8e1598a8..70693a8a 100644 --- a/subworkflows/local/align_minimap2.nf +++ b/subworkflows/local/align_minimap2.nf @@ -2,12 +2,8 @@ * Alignment with MINIMAP2 */ -params.index_options = [:] -params.align_options = [:] -params.samtools_options = [:] - -include { MINIMAP2_INDEX } from '../../modules/local/minimap2_index' addParams( options: params.index_options ) -include { MINIMAP2_ALIGN } from '../../modules/local/minimap2_align' addParams( options: params.align_options ) +include { MINIMAP2_INDEX } from '../../modules/local/minimap2_index' +include { MINIMAP2_ALIGN } from '../../modules/local/minimap2_align' workflow ALIGN_MINIMAP2 { take: diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index c7ecc2b5..9971a86a 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -2,13 +2,11 @@ * Sort, index BAM file and run samtools stats, flagstat and idxstats */ -params.options = [:] - -include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' addParams( options: params.options ) -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' addParams( options: params.options ) -include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' addParams( options: params.options ) -include { SAMTOOLS_SORT_INDEX } from '../../modules/local/samtools_sort_index' addParams( options: params.options ) -include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' addParams( options: params.options ) +include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' +include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' +include { SAMTOOLS_SORT_INDEX } from '../../modules/local/samtools_sort_index' +include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' workflow BAM_SORT_INDEX_SAMTOOLS { take: diff --git a/subworkflows/local/bedtools_ucsc_bigbed.nf b/subworkflows/local/bedtools_ucsc_bigbed.nf index 90c8a081..0a8d94b3 100644 --- a/subworkflows/local/bedtools_ucsc_bigbed.nf +++ b/subworkflows/local/bedtools_ucsc_bigbed.nf @@ -2,10 +2,8 @@ * Convert BAM to BigBed */ -params.bigbed_options = [:] - -include { BEDTOOLS_BAMBED } from '../../modules/local/bedtools_bamtobed' addParams( options: params.bigbed_options ) -include { UCSC_BED12TOBIGBED } from '../../modules/local/ucsc_bed12tobigbed' addParams( options: params.bigbed_options ) +include { BEDTOOLS_BAMBED } from '../../modules/local/bedtools_bamtobed' +include { UCSC_BED12TOBIGBED } from '../../modules/local/ucsc_bed12tobigbed' workflow BEDTOOLS_UCSC_BIGBED { take: diff --git a/subworkflows/local/bedtools_ucsc_bigwig.nf b/subworkflows/local/bedtools_ucsc_bigwig.nf index be9a90b0..ab45a51e 100644 --- a/subworkflows/local/bedtools_ucsc_bigwig.nf +++ b/subworkflows/local/bedtools_ucsc_bigwig.nf @@ -2,10 +2,8 @@ * Convert BAM to BigWig */ -params.bigwig_options = [:] - -include { BEDTOOLS_GENOMECOV } from '../../modules/local/bedtools_genomecov' addParams( options: params.bigwig_options ) -include { UCSC_BEDGRAPHTOBIGWIG } from '../../modules/local/ucsc_bedgraphtobigwig' addParams( options: params.bigwig_options ) +include { BEDTOOLS_GENOMECOV } from '../../modules/local/bedtools_genomecov' +include { UCSC_BEDGRAPHTOBIGWIG } from '../../modules/local/ucsc_bedgraphtobigwig' workflow BEDTOOLS_UCSC_BIGWIG { take: diff --git a/subworkflows/local/differential_deseq2_dexseq.nf b/subworkflows/local/differential_deseq2_dexseq.nf index 9e7279b4..df42c79e 100644 --- a/subworkflows/local/differential_deseq2_dexseq.nf +++ b/subworkflows/local/differential_deseq2_dexseq.nf @@ -2,12 +2,8 @@ * Differential Expression Analysis with DESeq2 and DEXSeq */ -params.deseq2_options = [:] -params.dexseq_options = [:] - -include { DESEQ2 } from '../../modules/local/deseq2' addParams( options: params.deseq2_options ) -include { DEXSEQ } from '../../modules/local/dexseq' addParams( options: params.dexseq_options ) - +include { DESEQ2 } from '../../modules/local/deseq2' +include { DEXSEQ } from '../../modules/local/dexseq' workflow DIFFERENTIAL_DESEQ2_DEXSEQ { take: diff --git a/subworkflows/local/dna_variant_calling.nf b/subworkflows/local/dna_variant_calling.nf index 3ad02329..27d1ffd1 100644 --- a/subworkflows/local/dna_variant_calling.nf +++ b/subworkflows/local/dna_variant_calling.nf @@ -1,11 +1,9 @@ /* * DNA variant calling */ -params.medaka_vc_options = [:] -params.sniffles_sv_options = [:] -include { MEDAKA } from '../../modules/local/medaka_variant' addParams( options: params.medaka_vc_options ) -include { SNIFFLES } from '../../modules/local/sniffles' addParams( options: params.sniffles_sv_options ) +include { MEDAKA_VARIANT } from '../../modules/local/medaka_variant' +include { SNIFFLES } from '../../modules/local/sniffles' workflow DNA_VARIANT_CALLING { @@ -37,8 +35,8 @@ workflow DNA_VARIANT_CALLING { /* * Call variants with MEDAKA */ - MEDAKA( ch_view_sortbam, ch_index ) - ch_variant_calls = MEDAKA.out.variant_calls + MEDAKA_VARIANT( ch_view_sortbam, ch_index ) + ch_variant_calls = MEDAKA_VARIANT.out.variant_calls } ch_sv_calls = Channel.empty() if (!skip_sniffles){ diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 4a55975d..a7031cbc 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -2,9 +2,7 @@ * Check input samplesheet and get read channels */ -params.options = [:] - -include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' addParams( options: params.options ) +include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: @@ -12,6 +10,7 @@ workflow INPUT_CHECK { main: SAMPLESHEET_CHECK ( samplesheet ) + .csv .splitCsv ( header:true, sep:',' ) .map { get_sample_info(it, params.genomes) } .map { it -> [ it[0], it[2], it[3], it[4], it[5], it[6], it[1] , it[7] ] } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 4c57a4d0..f415dea1 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -2,10 +2,8 @@ * Prepare genome/transcriptome before alignment */ -params.genome_options = [:] - -include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' addParams( options: params.genome_options ) -include { GTF2BED } from '../../modules/local/gtf2bed' addParams( options: params.genome_options ) +include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' +include { GTF2BED } from '../../modules/local/gtf2bed' workflow PREPARE_GENOME { take: diff --git a/subworkflows/nf-core/qcbasecall_pycoqc_nanoplot.nf b/subworkflows/local/qcbasecall_pycoqc_nanoplot.nf similarity index 83% rename from subworkflows/nf-core/qcbasecall_pycoqc_nanoplot.nf rename to subworkflows/local/qcbasecall_pycoqc_nanoplot.nf index d6c2f971..397a8572 100644 --- a/subworkflows/nf-core/qcbasecall_pycoqc_nanoplot.nf +++ b/subworkflows/local/qcbasecall_pycoqc_nanoplot.nf @@ -2,11 +2,8 @@ * Basecalling QC with PycoQC and NanoPlot */ -params.pycoqc_options = [:] -params.nanoplot_summary_options = [:] - -include { PYCOQC } from '../../modules/nf-core/modules/pycoqc/main' addParams( options: params.pycoqc_options ) -include { NANOPLOT } from '../../modules/nf-core/modules/nanoplot/main' addParams( options: params.nanoplot_summary_options ) +include { PYCOQC } from '../../modules/nf-core/modules/pycoqc/main' +include { NANOPLOT } from '../../modules/local/nanoplot' workflow QCBASECALL_PYCOQC_NANOPLOT { take: diff --git a/subworkflows/nf-core/qcfastq_nanoplot_fastqc.nf b/subworkflows/local/qcfastq_nanoplot_fastqc.nf similarity index 86% rename from subworkflows/nf-core/qcfastq_nanoplot_fastqc.nf rename to subworkflows/local/qcfastq_nanoplot_fastqc.nf index 135e00ca..a719abf9 100644 --- a/subworkflows/nf-core/qcfastq_nanoplot_fastqc.nf +++ b/subworkflows/local/qcfastq_nanoplot_fastqc.nf @@ -2,11 +2,8 @@ * FastQ QC with NanoPlot and fastqc */ -params.nanoplot_fastq_options = [:] -params.fastqc_options = [:] - -include { NANOPLOT } from '../../modules/nf-core/modules/nanoplot/main' addParams( options: params.nanoplot_fastq_options ) -include { FASTQC } from '../../modules/nf-core/modules/fastqc/main' addParams( options: params.fastqc_options ) +include { NANOPLOT } from '../../modules/local/nanoplot' +include { FASTQC } from '../../modules/nf-core/modules/fastqc/main' workflow QCFASTQ_NANOPLOT_FASTQC { take: diff --git a/subworkflows/local/quantify_stringtie_featurecounts.nf b/subworkflows/local/quantify_stringtie_featurecounts.nf index bab6e6b1..c5055167 100644 --- a/subworkflows/local/quantify_stringtie_featurecounts.nf +++ b/subworkflows/local/quantify_stringtie_featurecounts.nf @@ -2,12 +2,9 @@ * Transcript Discovery and Quantification with StringTie2 and FeatureCounts */ -params.stringtie2_options = [:] -params.featurecounts_options = [:] - -include { STRINGTIE2 } from '../../modules/local/stringtie2' addParams( options: params.stringtie2_options ) -include { STRINGTIE_MERGE } from '../../modules/nf-core/modules/stringtie/merge/main' addParams( options: params.stringtie2_options ) -include { SUBREAD_FEATURECOUNTS } from '../../modules/local/subread_featurecounts' addParams( options: params.featurecounts_options ) +include { STRINGTIE2 } from '../../modules/local/stringtie2' +include { STRINGTIE_MERGE } from '../../modules/nf-core/modules/stringtie/merge/main' +include { SUBREAD_FEATURECOUNTS } from '../../modules/local/subread_featurecounts' workflow QUANTIFY_STRINGTIE_FEATURECOUNTS { take: diff --git a/subworkflows/local/sv_sniffles.nf b/subworkflows/local/sv_sniffles.nf deleted file mode 100644 index 9f29cb45..00000000 --- a/subworkflows/local/sv_sniffles.nf +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Structural variant calling with SNIFFLES - */ - -params.sniffles_sv_options = [:] - -include { SNIFFLES } from '../../modules/local/sniffles' addParams( options: params.sniffles_sv_options ) - -workflow SV_SNIFFLES { - take: - ch_view_sortbam - - main: - /* - * Call variants with MEDAKA - */ - SNIFFLES( ch_view_sortbam ) - ch_sv_calls = SNIFFLES.out.sv_calls - - emit: - ch_sv_calls - -} - diff --git a/subworkflows/local/vc_medaka.nf b/subworkflows/local/vc_medaka.nf deleted file mode 100644 index 742f3568..00000000 --- a/subworkflows/local/vc_medaka.nf +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Small variant calling with MEDAKA - */ - -params.medaka_vc_options = [:] - -include { MEDAKA } from '../../modules/local/medaka_variant' addParams( options: params.medaka_vc_options ) - -workflow VC_MEDAKA { - take: - ch_view_sortbam // - ch_index // - - main: - /* - * Split into a different channel for each chromosome - */ - // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling - //SPLIT_CHROM( ch_view_sortbam ) - //.splitCsv() - //.combine( ch_view_sortbam ) // - //.unique() - //.map { it -> [ it[1], it[4], it[5], it[0] ] } // - //.map{ meta, bam, bai, chrom -> - //new_meta = meta.clone() - //new_meta.chrom = chrom - //[new_meta, bam, bai] - //}.set{ch_bam_vc_chrom} - - /* - * Call variants with MEDAKA - */ - MEDAKA( ch_view_sortbam, ch_index ) - ch_variant_calls = MEDAKA.out.variant_calls - - - // TODO Add module to concatenate variant calls back togehter and index - - emit: - ch_variant_calls - -} diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf index 4f1c2f36..5d1c5078 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -2,11 +2,9 @@ * Run SAMtools stats, flagstat and idxstats */ -params.options = [:] - -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' addParams( options: params.options ) -include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' addParams( options: params.options ) -include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' addParams( options: params.options ) +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' +include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' +include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' workflow BAM_STATS_SAMTOOLS { take: diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 3a49a654..fb44feca 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -94,58 +94,30 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi /* -- IMPORT LOCAL MODULES/SUBWORKFLOWS -- */ //////////////////////////////////////////////////// -// Don't overwrite global params.modules, create a copy instead and use that within the main script. -def modules = params.modules.clone() - -def multiqc_options = modules['multiqc'] -multiqc_options.args += params.multiqc_title ? " --title \"$params.multiqc_title\"" : '' -if (params.skip_alignment) { multiqc_options['publish_dir'] = '' } - -def guppy_options = modules['guppy'] -def qcat_options = modules['qcat'] -def nanolyse_options = modules['nanolyse'] -def bambu_options = modules['bambu'] - -include { GET_TEST_DATA } from '../modules/local/get_test_data' addParams( options: [:] ) -include { GET_NANOLYSE_FASTA } from '../modules/local/get_nanolyse_fasta' addParams( options: [:] ) -include { GUPPY } from '../modules/local/guppy' addParams( options: guppy_options ) -include { QCAT } from '../modules/local/qcat' addParams( options: qcat_options ) -include { BAM_RENAME } from '../modules/local/bam_rename' addParams( options: [:] ) -include { BAMBU } from '../modules/local/bambu' addParams( options: bambu_options ) -include { GET_SOFTWARE_VERSIONS } from '../modules/local/get_software_versions' addParams( options: [publish_files : ['csv':'']] ) -include { MULTIQC } from '../modules/local/multiqc' addParams( options: multiqc_options ) +include { GET_TEST_DATA } from '../modules/local/get_test_data' +include { GET_NANOLYSE_FASTA } from '../modules/local/get_nanolyse_fasta' +include { GUPPY } from '../modules/local/guppy' +include { QCAT } from '../modules/local/qcat' +include { BAM_RENAME } from '../modules/local/bam_rename' +include { BAMBU } from '../modules/local/bambu' +include { MULTIQC } from '../modules/local/multiqc' /* * SUBWORKFLOW: Consisting of a mix of local and nf-core/modules */ -def pycoqc_options = modules['pycoqc'] -def nanoplot_options = modules['nanoplot'] -def fastqc_options = modules['fastqc'] -def genome_options = modules['get_chrom_size'] -def graphmap2_index_options = modules['graphmap2_index'] -def graphmap2_align_options = modules['graphmap2_align'] -def minimap2_index_options = modules['minimap2_index'] -def minimap2_align_options = modules['minimap2_align'] -def medaka_vc_options = modules['medaka_vc'] -def sniffles_sv_options = modules['sniffles_sv'] -def samtools_sort_options = modules['samtools_sort'] -def bigwig_options = modules['ucsc_bedgraphtobigwig'] -def bigbed_options = modules['ucsc_bed12tobigbed'] -def stringtie2_options = modules['stringtie2'] -def featurecounts_options = modules['subread_featurecounts'] -def deseq2_options = modules['deseq2'] -def dexseq_options = modules['dexseq'] - -include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) -include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( genome_options: genome_options ) -include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options ) -include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options ) -include { BAM_SORT_INDEX_SAMTOOLS } from '../subworkflows/local/bam_sort_index_samtools' addParams( samtools_options: samtools_sort_options ) -include { DNA_VARIANT_CALLING } from '../subworkflows/local/dna_variant_calling' addParams( medaka_vc_options: medaka_vc_options, sniffles_sv_options: sniffles_sv_options) -include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtools_ucsc_bigwig' addParams( bigwig_options: bigwig_options ) -include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' addParams( bigbed_options: bigbed_options ) -include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' addParams( stringtie2_options: stringtie2_options, featurecounts_options: featurecounts_options ) -include { DIFFERENTIAL_DESEQ2_DEXSEQ } from '../subworkflows/local/differential_deseq2_dexseq' addParams( deseq2_options: deseq2_options, dexseq_options: dexseq_options ) + +include { INPUT_CHECK } from '../subworkflows/local/input_check' +include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' +include { QCBASECALL_PYCOQC_NANOPLOT } from '../subworkflows/local/qcbasecall_pycoqc_nanoplot' +include { QCFASTQ_NANOPLOT_FASTQC } from '../subworkflows/local/qcfastq_nanoplot_fastqc' +include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' +include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' +include { BAM_SORT_INDEX_SAMTOOLS } from '../subworkflows/local/bam_sort_index_samtools' +include { DNA_VARIANT_CALLING } from '../subworkflows/local/dna_variant_calling' +include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtools_ucsc_bigwig' +include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' +include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' +include { DIFFERENTIAL_DESEQ2_DEXSEQ } from '../subworkflows/local/differential_deseq2_dexseq' //////////////////////////////////////////////////// /* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ @@ -154,14 +126,12 @@ include { DIFFERENTIAL_DESEQ2_DEXSEQ } from '../subworkflows/local/differe /* * MODULE: Installed directly from nf-core/modules */ -include { NANOLYSE } from '../modules/nf-core/modules/nanolyse/main' addParams( options: nanolyse_options ) -include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' addParams( options: [publish_files : ['_versions.yml':'']] ) +include { NANOLYSE } from '../modules/nf-core/modules/nanolyse/main' +include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* * SUBWORKFLOW: Consisting entirely of nf-core/modules (BAM_SORT_SAMTOOLS & BAM_STAT_SAMTOOLS are within two local subworkflows) */ -include { QCBASECALL_PYCOQC_NANOPLOT } from '../subworkflows/nf-core/qcbasecall_pycoqc_nanoplot' addParams( pycoqc_options: pycoqc_options, nanoplot_options: nanoplot_options ) -include { QCFASTQ_NANOPLOT_FASTQC } from '../subworkflows/nf-core/qcfastq_nanoplot_fastqc' addParams( nanoplot_options: nanoplot_options, fastqc_options: fastqc_options ) //////////////////////////////////////////////////// /* -- RUN MAIN WORKFLOW -- */ @@ -175,6 +145,9 @@ workflow NANOSEQ{ /* * SUBWORKFLOW: Read in samplesheet, validate and stage input files */ + left = Channel.from(['X', 1], ['Y', 2], ['Z', 3], ['P', 7]) + right= Channel.from(['Z', 6], ['Y', 5], ['X', 4]) + left.join(right).view() INPUT_CHECK ( ch_input ) .set { ch_sample } From 33325c5dab07c49a4d2cd34366111ec8f19c3cf9 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 17 Dec 2021 09:45:35 +0800 Subject: [PATCH 016/169] minor fixes --- .gitattributes | 3 +++ conf/modules.config | 4 ++-- lib/NfcoreSchema.groovy | 27 ++++++++++++++++++++------- lib/NfcoreTemplate.groovy | 31 ++++++++++--------------------- modules.json | 6 ------ 5 files changed, 35 insertions(+), 36 deletions(-) diff --git a/.gitattributes b/.gitattributes index 7fe55006..1ff194da 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,4 @@ *.config linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated + diff --git a/conf/modules.config b/conf/modules.config index e969133a..3f0e1632 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -258,7 +258,7 @@ if (!params.skip_quantification) { ] } } - if (!params.differential_analysis) { + if (!params.skip_differential_analysis) { process { withName: DESEQ2 { publishDir = [ @@ -294,7 +294,7 @@ if (!params.skip_quantification) { ] } } - if (!params.differential_analysis) { + if (!params.skip_differential_analysis) { process { withName: DESEQ2 { publishDir = [ diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 8d6920dd..ed96f4fe 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -155,7 +159,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } @@ -202,7 +206,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -260,13 +264,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -330,7 +333,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log) { + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -346,11 +349,20 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - log.error "* --${param}: ${ex_json['message']} (${param_val})" + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } } } for (ex in causingExceptions) { - printExceptions(ex, params_json, log) + printExceptions(ex, params_json, log, enums) } } @@ -515,3 +527,4 @@ class NfcoreSchema { return max_chars } } + diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 44551e0a..4b90eb9b 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,27 +19,16 @@ class NfcoreTemplate { } // - // Check params.hostnames + // Warn if a -profile or Nextflow config has not been provided to run the pipeline // - public static void hostName(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (params.hostnames) { - try { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } catch (Exception e) { - log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." - } + public static void checkConfigProvided(workflow, log) { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " } } @@ -168,7 +157,6 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { - hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } @@ -268,3 +256,4 @@ class NfcoreTemplate { ) } } + diff --git a/modules.json b/modules.json index c294a50b..77d36baa 100644 --- a/modules.json +++ b/modules.json @@ -12,9 +12,6 @@ "nanolyse": { "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, - "nanoplot": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" - }, "pycoqc": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" }, @@ -35,9 +32,6 @@ }, "stringtie/merge": { "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" - }, - "multiqc": { - "git_sha": "97505c6b4a7ad5729faf2ef8b68eff60630c0930" } } } From 5fc96c3d3a97bd83a3c6c53ec27842d0b6356cf4 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 17 Dec 2021 09:50:27 +0800 Subject: [PATCH 017/169] revert to original lib --- .gitattributes | 1 - lib/NfcoreSchema.groovy | 27 +++++++-------------------- lib/NfcoreTemplate.groovy | 31 +++++++++++++++++++++---------- 3 files changed, 28 insertions(+), 31 deletions(-) diff --git a/.gitattributes b/.gitattributes index 1ff194da..050bb120 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,4 +1,3 @@ *.config linguist-language=nextflow modules/nf-core/** linguist-generated subworkflows/nf-core/** linguist-generated - diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index ed96f4fe..8d6920dd 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,13 +105,9 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] - def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) - if (group.value['properties'][p.key].containsKey('enum')) { - enums[p.key] = group.value['properties'][p.key]['enum'] - } } } @@ -159,7 +155,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log, enums) + printExceptions(exceptionJSON, params_json, log) println '' has_error = true } @@ -206,7 +202,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -264,12 +260,13 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] + def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param)) { + if (params.containsKey(param) && !blacklist.contains(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -333,7 +330,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log, enums, limit=5) { + private static void printExceptions(ex_json, params_json, log) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -349,20 +346,11 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - if (enums.containsKey(param)) { - def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" - if (enums[param].size() > limit) { - log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" - } else { - log.error "${error_msg}: ${enums[param].join(', ')})" - } - } else { - log.error "* --${param}: ${ex_json['message']} (${param_val})" - } + log.error "* --${param}: ${ex_json['message']} (${param_val})" } } for (ex in causingExceptions) { - printExceptions(ex, params_json, log, enums) + printExceptions(ex, params_json, log) } } @@ -527,4 +515,3 @@ class NfcoreSchema { return max_chars } } - diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 4b90eb9b..44551e0a 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,16 +19,27 @@ class NfcoreTemplate { } // - // Warn if a -profile or Nextflow config has not been provided to run the pipeline + // Check params.hostnames // - public static void checkConfigProvided(workflow, log) { - if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { - log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + - "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + - " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + - " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + - " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + - "Please refer to the quick start section and usage docs for the pipeline.\n " + public static void hostName(workflow, params, log) { + Map colors = logColours(params.monochrome_logs) + if (params.hostnames) { + try { + def hostname = "hostname".execute().text.trim() + params.hostnames.each { prof, hnames -> + hnames.each { hname -> + if (hostname.contains(hname) && !workflow.profile.contains(prof)) { + log.info "=${colors.yellow}====================================================${colors.reset}=\n" + + "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + + " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + + " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + + "=${colors.yellow}====================================================${colors.reset}=" + } + } + } + } catch (Exception e) { + log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." + } } } @@ -157,6 +168,7 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { + hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } @@ -256,4 +268,3 @@ class NfcoreTemplate { ) } } - From 66ce1952e6f94f2695ab9493730a56a87c8e871d Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 17 Dec 2021 11:01:34 +0800 Subject: [PATCH 018/169] update some lib/groovys --- lib/Headers.groovy | 1 - lib/NfcoreSchema.groovy | 26 +++-- lib/Schema.groovy | 228 ---------------------------------------- lib/Utils.groovy | 8 +- workflows/.Rhistory | 0 workflows/nanoseq.nf | 6 +- 6 files changed, 23 insertions(+), 246 deletions(-) delete mode 100644 lib/Schema.groovy delete mode 100644 workflows/.Rhistory diff --git a/lib/Headers.groovy b/lib/Headers.groovy index 036611d3..15d1d388 100644 --- a/lib/Headers.groovy +++ b/lib/Headers.groovy @@ -41,4 +41,3 @@ class Headers { ) } } - diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 8d6920dd..40ab65f2 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -105,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -155,7 +159,7 @@ class NfcoreSchema { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } @@ -202,7 +206,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -260,13 +264,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -330,7 +333,7 @@ class NfcoreSchema { // // Loop over nested exceptions and print the causingException // - private static void printExceptions(ex_json, params_json, log) { + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { def causingExceptions = ex_json['causingExceptions'] if (causingExceptions.length() == 0) { def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ @@ -346,11 +349,20 @@ class NfcoreSchema { else { def param = ex_json['pointerToViolation'] - ~/^#\// def param_val = params_json[param].toString() - log.error "* --${param}: ${ex_json['message']} (${param_val})" + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } } } for (ex in causingExceptions) { - printExceptions(ex, params_json, log) + printExceptions(ex, params_json, log, enums) } } diff --git a/lib/Schema.groovy b/lib/Schema.groovy deleted file mode 100644 index 5105c7ba..00000000 --- a/lib/Schema.groovy +++ /dev/null @@ -1,228 +0,0 @@ -/* - * This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. - */ - -import groovy.json.JsonSlurper - -class Schema { - /* - * This method tries to read a JSON params file - */ - private static LinkedHashMap params_load(String json_schema) { - def params_map = new LinkedHashMap() - try { - params_map = params_read(json_schema) - } catch (Exception e) { - println "Could not read parameters settings from JSON. $e" - params_map = new LinkedHashMap() - } - return params_map - } - - /* - Method to actually read in JSON file using Groovy. - Group (as Key), values are all parameters - - Parameter1 as Key, Description as Value - - Parameter2 as Key, Description as Value - .... - Group - - - */ - private static LinkedHashMap params_read(String json_schema) throws Exception { - def json = new File(json_schema).text - def Map json_params = (Map) new JsonSlurper().parseText(json).get('definitions') - /* Tree looks like this in nf-core schema - * definitions <- this is what the first get('definitions') gets us - group 1 - title - description - properties - parameter 1 - type - description - parameter 2 - type - description - group 2 - title - description - properties - parameter 1 - type - description - */ - def params_map = new LinkedHashMap() - json_params.each { key, val -> - def Map group = json_params."$key".properties // Gets the property object of the group - def title = json_params."$key".title - def sub_params = new LinkedHashMap() - group.each { innerkey, value -> - sub_params.put(innerkey, value) - } - params_map.put(title, sub_params) - } - return params_map - } - - /* - * Get maximum number of characters across all parameter names - */ - private static Integer params_max_chars(params_map) { - Integer max_chars = 0 - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (param.size() > max_chars) { - max_chars = param.size() - } - } - } - return max_chars - } - - /* - * Beautify parameters for --help - */ - private static String params_help(workflow, params, json_schema, command) { - String output = Headers.nf_core(workflow, params.monochrome_logs) + "\n" - output += "Typical pipeline command:\n\n" - output += " ${command}\n\n" - def params_map = params_load(json_schema) - def max_chars = params_max_chars(params_map) + 1 - for (group in params_map.keySet()) { - output += group + "\n" - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - def type = "[" + group_params.get(param).type + "]" - def description = group_params.get(param).description - output += " \u001B[1m--" + param.padRight(max_chars) + "\u001B[1m" + type.padRight(10) + description + "\n" - } - output += "\n" - } - output += Headers.dashed_line(params.monochrome_logs) - output += "\n\n" + Checks.citation(workflow) - output += "\n\n" + Headers.dashed_line(params.monochrome_logs) - return output - } - - /* - * Groovy Map summarising parameters/workflow options used by the pipeline - */ - private static LinkedHashMap params_summary_map(workflow, params, json_schema) { - // Get a selection of core Nextflow workflow options - def Map workflow_summary = [:] - if (workflow.revision) { - workflow_summary['revision'] = workflow.revision - } - workflow_summary['runName'] = workflow.runName - if (workflow.containerEngine) { - workflow_summary['containerEngine'] = "$workflow.containerEngine" - } - if (workflow.container) { - workflow_summary['container'] = "$workflow.container" - } - workflow_summary['launchDir'] = workflow.launchDir - workflow_summary['workDir'] = workflow.workDir - workflow_summary['projectDir'] = workflow.projectDir - workflow_summary['userName'] = workflow.userName - workflow_summary['profile'] = workflow.profile - workflow_summary['configFiles'] = workflow.configFiles.join(', ') - - // Get pipeline parameters defined in JSON Schema - def Map params_summary = [:] - def blacklist = ['hostnames'] - def params_map = params_load(json_schema) - for (group in params_map.keySet()) { - def sub_params = new LinkedHashMap() - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { - def params_value = params.get(param) - def schema_value = group_params.get(param).default - def param_type = group_params.get(param).type - if (schema_value == null) { - if (param_type == 'boolean') { - schema_value = false - } - if (param_type == 'string') { - schema_value = '' - } - if (param_type == 'integer') { - schema_value = 0 - } - } else { - if (param_type == 'string') { - if (schema_value.contains('$projectDir') || schema_value.contains('${projectDir}')) { - def sub_string = schema_value.replace('\$projectDir','') - sub_string = sub_string.replace('\${projectDir}','') - if (params_value.contains(sub_string)) { - schema_value = params_value - } - } - if (schema_value.contains('$params.outdir') || schema_value.contains('${params.outdir}')) { - def sub_string = schema_value.replace('\$params.outdir','') - sub_string = sub_string.replace('\${params.outdir}','') - if ("${params.outdir}${sub_string}" == params_value) { - schema_value = params_value - } - } - } - } - - if (params_value != schema_value) { - sub_params.put("$param", params_value) - } - } - } - params_summary.put(group, sub_params) - } - return [ 'Core Nextflow options' : workflow_summary ] << params_summary - } - - /* - * Beautify parameters for summary and return as string - */ - private static String params_summary_log(workflow, params, json_schema) { - String output = Headers.nf_core(workflow, params.monochrome_logs) + "\n" - def params_map = params_summary_map(workflow, params, json_schema) - def max_chars = params_max_chars(params_map) - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - if (group_params) { - output += group + "\n" - for (param in group_params.keySet()) { - output += " \u001B[1m" + param.padRight(max_chars) + ": \u001B[1m" + group_params.get(param) + "\n" - } - output += "\n" - } - } - output += Headers.dashed_line(params.monochrome_logs) - output += "\n\n" + Checks.citation(workflow) - output += "\n\n" + Headers.dashed_line(params.monochrome_logs) - return output - } - - static String params_summary_multiqc(workflow, summary) { - String summary_section = '' - for (group in summary.keySet()) { - def group_params = summary.get(group) // This gets the parameters of that particular group - if (group_params) { - summary_section += "

$group

\n" - summary_section += "
\n" - for (param in group_params.keySet()) { - summary_section += "
$param
${group_params.get(param) ?: 'N/A'}
\n" - } - summary_section += "
\n" - } - } - - String yaml_file_text = "id: '${workflow.manifest.name.replace('/','-')}-summary'\n" - yaml_file_text += "description: ' - this information is collected when the pipeline is started.'\n" - yaml_file_text += "section_name: '${workflow.manifest.name} Workflow Summary'\n" - yaml_file_text += "section_href: 'https://github.com/${workflow.manifest.name}'\n" - yaml_file_text += "plot_type: 'html'\n" - yaml_file_text += "data: |\n" - yaml_file_text += "${summary_section}" - return yaml_file_text - } -} diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 18173e98..242ea4db 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -37,11 +37,5 @@ class Utils { "===================================================================================" } } - - // - // Join module args with appropriate spacing - // - public static String joinModuleArgs(args_list) { - return ' ' + args_list.join(' ') - } } + diff --git a/workflows/.Rhistory b/workflows/.Rhistory deleted file mode 100644 index e69de29b..00000000 diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index fb44feca..0a2b79ed 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -2,7 +2,7 @@ /* -- LOCAL PARAMETER VALUES -- */ //////////////////////////////////////////////////// -params.summary_params = [:] +def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) //////////////////////////////////////////////////// /* -- VALIDATE INPUTS -- */ @@ -410,8 +410,8 @@ workflow NANOSEQ{ ) if (!params.skip_multiqc){ - workflow_summary = Schema.params_summary_multiqc(workflow, params.summary_params) - ch_workflow_summary = Channel.value(workflow_summary).collectFile(name: 'workflow_summary_mqc.yaml') + workflow_summary = WorkflowNanoseq.paramsSummaryMultiqc(workflow, summary_params) + ch_workflow_summary = Channel.value(workflow_summary) /* * MODULE: MultiQC From 708bc5b855f3ae0048bcaae4d2e18ea93656b500 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 17 Dec 2021 11:16:20 +0800 Subject: [PATCH 019/169] sort out the rest of the lib/groovys --- lib/Checks.groovy | 109 -------------------------- lib/Completion.groovy | 156 -------------------------------------- lib/Headers.groovy | 43 ----------- lib/NfcoreTemplate.groovy | 30 +++----- lib/WorkflowMain.groovy | 6 +- workflows/nanoseq.nf | 8 +- 6 files changed, 18 insertions(+), 334 deletions(-) delete mode 100644 lib/Checks.groovy delete mode 100644 lib/Completion.groovy delete mode 100644 lib/Headers.groovy diff --git a/lib/Checks.groovy b/lib/Checks.groovy deleted file mode 100644 index 4a4f0ca8..00000000 --- a/lib/Checks.groovy +++ /dev/null @@ -1,109 +0,0 @@ -import org.yaml.snakeyaml.Yaml - -/* - * This file holds several functions used to perform standard checks for the nf-core pipeline template. - */ - -class Checks { - - static void check_conda_channels(log) { - Yaml parser = new Yaml() - def channels = [] - try { - def config = parser.load("conda config --show channels".execute().text) - channels = config.channels - } catch(NullPointerException | IOException e) { - log.warn "Could not verify conda channel configuration." - return - } - - // Check that all channels are present - def required_channels = ['conda-forge', 'bioconda', 'defaults'] - def conda_check_failed = !required_channels.every { ch -> ch in channels } - - // Check that they are in the right order - conda_check_failed |= !(channels.indexOf('conda-forge') < channels.indexOf('bioconda')) - conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) - - if (conda_check_failed) { - log.warn "=============================================================================\n" + - " There is a problem with your Conda configuration!\n\n" + - " You will need to set-up the conda-forge and bioconda channels correctly.\n" + - " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + - " NB: The order of the channels matters!\n" + - "===================================================================================" - } - } - - static void aws_batch(workflow, params) { - if (workflow.profile.contains('awsbatch')) { - assert (params.awsqueue && params.awsregion) : "Specify correct --awsqueue and --awsregion parameters on AWSBatch!" - // Check outdir paths to be S3 buckets if running on AWSBatch - // related: https://github.com/nextflow-io/nextflow/issues/813 - assert params.outdir.startsWith('s3:') : "Outdir not on S3 - specify S3 Bucket to run on AWSBatch!" - // Prevent trace files to be stored on S3 since S3 does not support rolling files. - assert !params.tracedir.startsWith('s3:') : "Specify a local tracedir or run without trace! S3 cannot be used for tracefiles." - } - } - - static void hostname(workflow, params, log) { - Map colors = Headers.log_colours(params.monochrome_logs) - if (params.hostnames) { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } - } - - // Citation string - private static String citation(workflow) { - return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + - "* The pipeline\n" + - " https://doi.org/10.5281/zenodo.3697959\n\n" + - "* The nf-core framework\n" + - " https://dx.doi.org/10.1038/s41587-020-0439-x\n" + - " https://rdcu.be/b1GjZ\n\n" + - "* Software dependencies\n" + - " https://github.com/${workflow.manifest.name}/blob/master/CITATIONS.md" - } - - // Print a warning if using GRCh38 assembly from igenomes.config - static void ncbi_genome_warn(log) { - log.warn "=============================================================================\n" + - " When using '--genome GRCh38' the assembly is from the NCBI and NOT Ensembl.\n" + - " Auto-activating '--skip_biotype_qc' parameter to circumvent the issue below:\n" + - " https://github.com/nf-core/rnaseq/issues/460.\n\n" + - " If you would like to use the soft-masked Ensembl assembly instead please see:\n" + - " https://github.com/nf-core/rnaseq/issues/159#issuecomment-501184312\n" + - "===================================================================================" - } - - // Print a warning if using a UCSC assembly from igenomes.config - static void ucsc_genome_warn(log) { - log.warn "=============================================================================\n" + - " When using UCSC assemblies the 'gene_biotype' field is absent from the GTF file.\n" + - " Auto-activating '--skip_biotype_qc' parameter to circumvent the issue below:\n" + - " https://github.com/nf-core/rnaseq/issues/460.\n\n" + - " If you would like to use the soft-masked Ensembl assembly instead please see:\n" + - " https://github.com/nf-core/rnaseq/issues/159#issuecomment-501184312\n" + - "===================================================================================" - } - - // Print a warning if --skip_alignment has been provided - static void skip_alignment_warn(log) { - log.warn "=============================================================================\n" + - " '--skip_alignment' parameter has been provided.\n" + - " Skipping alignment, quantification and all downstream QC processes.\n" + - "===================================================================================" - } - -} diff --git a/lib/Completion.groovy b/lib/Completion.groovy deleted file mode 100644 index 1e83fdad..00000000 --- a/lib/Completion.groovy +++ /dev/null @@ -1,156 +0,0 @@ -/* - * Functions to be run on completion of pipeline - */ - -class Completion { - static void email(workflow, params, summary_params, projectDir, log, multiqc_report=[], fail_percent_mapped=[:]) { - - // Set up the e-mail variables - def subject = "[$workflow.manifest.name] Successful: $workflow.runName" - if (fail_percent_mapped.size() > 0) { - subject = "[$workflow.manifest.name] Partially successful (${fail_percent_mapped.size()} skipped): $workflow.runName" - } - if (!workflow.success) { - subject = "[$workflow.manifest.name] FAILED: $workflow.runName" - } - - def summary = [:] - for (group in summary_params.keySet()) { - summary << summary_params[group] - } - - def misc_fields = [:] - misc_fields['Date Started'] = workflow.start - misc_fields['Date Completed'] = workflow.complete - misc_fields['Pipeline script file path'] = workflow.scriptFile - misc_fields['Pipeline script hash ID'] = workflow.scriptId - if (workflow.repository) misc_fields['Pipeline repository Git URL'] = workflow.repository - if (workflow.commitId) misc_fields['Pipeline repository Git Commit'] = workflow.commitId - if (workflow.revision) misc_fields['Pipeline Git branch/tag'] = workflow.revision - misc_fields['Nextflow Version'] = workflow.nextflow.version - misc_fields['Nextflow Build'] = workflow.nextflow.build - misc_fields['Nextflow Compile Timestamp'] = workflow.nextflow.timestamp - - def email_fields = [:] - email_fields['version'] = workflow.manifest.version - email_fields['runName'] = workflow.runName - email_fields['success'] = workflow.success - email_fields['dateComplete'] = workflow.complete - email_fields['duration'] = workflow.duration - email_fields['exitStatus'] = workflow.exitStatus - email_fields['errorMessage'] = (workflow.errorMessage ?: 'None') - email_fields['errorReport'] = (workflow.errorReport ?: 'None') - email_fields['commandLine'] = workflow.commandLine - email_fields['projectDir'] = workflow.projectDir - email_fields['summary'] = summary << misc_fields - email_fields['fail_percent_mapped'] = fail_percent_mapped.keySet() - email_fields['min_mapped_reads'] = params.min_mapped_reads - - // On success try attach the multiqc report - def mqc_report = null - try { - if (workflow.success && !params.skip_multiqc) { - mqc_report = multiqc_report.getVal() - if (mqc_report.getClass() == ArrayList && mqc_report.size() >= 1) { - if (mqc_report.size() > 1) { - log.warn "[$workflow.manifest.name] Found multiple reports from process 'MULTIQC', will use only one" - } - mqc_report = mqc_report[0] - } - } - } catch (all) { - log.warn "[$workflow.manifest.name] Could not attach MultiQC report to summary email" - } - - // Check if we are only sending emails on failure - def email_address = params.email - if (!params.email && params.email_on_fail && !workflow.success) { - email_address = params.email_on_fail - } - - // Render the TXT template - def engine = new groovy.text.GStringTemplateEngine() - def tf = new File("$projectDir/assets/email_template.txt") - def txt_template = engine.createTemplate(tf).make(email_fields) - def email_txt = txt_template.toString() - - // Render the HTML template - def hf = new File("$projectDir/assets/email_template.html") - def html_template = engine.createTemplate(hf).make(email_fields) - def email_html = html_template.toString() - - // Render the sendmail template - def max_multiqc_email_size = params.max_multiqc_email_size as nextflow.util.MemoryUnit - def smail_fields = [ email: email_address, subject: subject, email_txt: email_txt, email_html: email_html, projectDir: "$projectDir", mqcFile: mqc_report, mqcMaxSize: max_multiqc_email_size.toBytes()] - def sf = new File("$projectDir/assets/sendmail_template.txt") - def sendmail_template = engine.createTemplate(sf).make(smail_fields) - def sendmail_html = sendmail_template.toString() - - // Send the HTML e-mail - Map colors = Headers.log_colours(params.monochrome_logs) - if (email_address) { - try { - if (params.plaintext_email) { throw GroovyException('Send plaintext e-mail, not HTML') } - // Try to send HTML e-mail using sendmail - [ 'sendmail', '-t' ].execute() << sendmail_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (sendmail)-" - } catch (all) { - // Catch failures and try with plaintext - def mail_cmd = [ 'mail', '-s', subject, '--content-type=text/html', email_address ] - if ( mqc_report.size() <= max_multiqc_email_size.toBytes() ) { - mail_cmd += [ '-A', mqc_report ] - } - mail_cmd.execute() << email_html - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Sent summary e-mail to $email_address (mail)-" - } - } - - // Write summary e-mail HTML to a file - def output_d = new File("${params.outdir}/pipeline_info/") - if (!output_d.exists()) { - output_d.mkdirs() - } - def output_hf = new File(output_d, "pipeline_report.html") - output_hf.withWriter { w -> w << email_html } - def output_tf = new File(output_d, "pipeline_report.txt") - output_tf.withWriter { w -> w << email_txt } - } - - static void summary(workflow, params, log, fail_percent_mapped=[:], pass_percent_mapped=[:]) { - Map colors = Headers.log_colours(params.monochrome_logs) - - if (pass_percent_mapped.size() > 0) { - def idx = 0 - def samp_aln = '' - def total_aln_count = pass_percent_mapped.size() + fail_percent_mapped.size() - for (samp in pass_percent_mapped) { - samp_aln += " ${samp.value}%: ${samp.key}\n" - idx += 1 - if (idx > 5) { - samp_aln += " ..see pipeline reports for full list\n" - break; - } - } - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} ${pass_percent_mapped.size()}/$total_aln_count samples passed STAR ${params.min_mapped_reads}% mapped threshold:\n${samp_aln}${colors.reset}-" - } - if (fail_percent_mapped.size() > 0) { - def samp_aln = '' - for (samp in fail_percent_mapped) { - samp_aln += " ${samp.value}%: ${samp.key}\n" - } - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} ${fail_percent_mapped.size()} samples skipped since they failed STAR ${params.min_mapped_reads}% mapped threshold:\n${samp_aln}${colors.reset}-" - } - - if (workflow.success) { - if (workflow.stats.ignoredCount == 0) { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.green} Pipeline completed successfully${colors.reset}-" - } else { - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" - } - } else { - Checks.hostname(workflow, params, log) - log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" - } - } -} - diff --git a/lib/Headers.groovy b/lib/Headers.groovy deleted file mode 100644 index 15d1d388..00000000 --- a/lib/Headers.groovy +++ /dev/null @@ -1,43 +0,0 @@ -/* - * This file holds several functions used to render the nf-core ANSI header. - */ - -class Headers { - - private static Map log_colours(Boolean monochrome_logs) { - Map colorcodes = [:] - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['yellow_bold'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - colorcodes['red'] = monochrome_logs ? '' : "\033[1;91m" - return colorcodes - } - - static String dashed_line(monochrome_logs) { - Map colors = log_colours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" - } - - static String nf_core(workflow, monochrome_logs) { - Map colors = log_colours(monochrome_logs) - String.format( - """\n - ${dashed_line(monochrome_logs)} - ${colors.green},--.${colors.black}/${colors.green},-.${colors.reset} - ${colors.blue} ___ __ __ __ ___ ${colors.green}/,-._.--~\'${colors.reset} - ${colors.blue} |\\ | |__ __ / ` / \\ |__) |__ ${colors.yellow}} {${colors.reset} - ${colors.blue} | \\| | \\__, \\__/ | \\ |___ ${colors.green}\\`-._,-`-,${colors.reset} - ${colors.green}`._,._,\'${colors.reset} - ${colors.purple} ${workflow.manifest.name} v${workflow.manifest.version}${colors.reset} - ${dashed_line(monochrome_logs)} - """.stripIndent() - ) - } -} diff --git a/lib/NfcoreTemplate.groovy b/lib/NfcoreTemplate.groovy index 44551e0a..2fc0a9b9 100755 --- a/lib/NfcoreTemplate.groovy +++ b/lib/NfcoreTemplate.groovy @@ -19,27 +19,16 @@ class NfcoreTemplate { } // - // Check params.hostnames + // Warn if a -profile or Nextflow config has not been provided to run the pipeline // - public static void hostName(workflow, params, log) { - Map colors = logColours(params.monochrome_logs) - if (params.hostnames) { - try { - def hostname = "hostname".execute().text.trim() - params.hostnames.each { prof, hnames -> - hnames.each { hname -> - if (hostname.contains(hname) && !workflow.profile.contains(prof)) { - log.info "=${colors.yellow}====================================================${colors.reset}=\n" + - "${colors.yellow}WARN: You are running with `-profile $workflow.profile`\n" + - " but your machine hostname is ${colors.white}'$hostname'${colors.reset}.\n" + - " ${colors.yellow_bold}Please use `-profile $prof${colors.reset}`\n" + - "=${colors.yellow}====================================================${colors.reset}=" - } - } - } - } catch (Exception e) { - log.warn "[$workflow.manifest.name] Could not determine 'hostname' - skipping check. Reason: ${e.message}." - } + public static void checkConfigProvided(workflow, log) { + if (workflow.profile == 'standard' && workflow.configFiles.size() <= 1) { + log.warn "[$workflow.manifest.name] You are attempting to run the pipeline without any custom configuration!\n\n" + + "This will be dependent on your local compute environment but can be achieved via one or more of the following:\n" + + " (1) Using an existing pipeline profile e.g. `-profile docker` or `-profile singularity`\n" + + " (2) Using an existing nf-core/configs for your Institution e.g. `-profile crick` or `-profile uppmax`\n" + + " (3) Using your own local custom config e.g. `-c /path/to/your/custom.config`\n\n" + + "Please refer to the quick start section and usage docs for the pipeline.\n " } } @@ -168,7 +157,6 @@ class NfcoreTemplate { log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed successfully, but with errored process(es) ${colors.reset}-" } } else { - hostName(workflow, params, log) log.info "-${colors.purple}[$workflow.manifest.name]${colors.red} Pipeline completed with errors${colors.reset}-" } } diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index d1bb5ed3..21e9c4ad 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -60,6 +60,9 @@ class WorkflowMain { // Print parameter summary log to screen log.info paramsSummaryLog(workflow, params, log) + // Check that a -profile or Nextflow config has been provided to run the pipeline + NfcoreTemplate.checkConfigProvided(workflow, log) + // Check that conda channels are set-up correctly if (params.enable_conda) { Utils.checkCondaChannels(log) @@ -68,9 +71,6 @@ class WorkflowMain { // Check AWS batch settings NfcoreTemplate.awsBatch(workflow, params) - // Check the hostnames against configured profiles - NfcoreTemplate.hostName(workflow, params, log) - // Check input has been provided if (!params.input) { log.error "Please provide an input samplesheet to the pipeline e.g. '--input samplesheet.csv'" diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 0a2b79ed..7d765fe9 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -435,8 +435,12 @@ workflow NANOSEQ{ //////////////////////////////////////////////////// workflow.onComplete { -// Completion.email(workflow, params, params.summary_params, log, multiqc_report) - Completion.summary(workflow, params, log) + if (params.email) { + NfcoreTemplate.email(workflow, params, summary_params, projectDir, log, multiqc_report) + //Completion.email(workflow, params, params.summary_params, log, multiqc_report) + } +// Completion.summary(workflow, params, log) + NfcoreTemplate.summary(workflow, params, log) } //////////////////////////////////////////////////// From 6314cbdc5ff4e4ead37ac30b12157fa53848cc10 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 17 Dec 2021 15:20:21 +0800 Subject: [PATCH 020/169] fix multiqc: Path value cannot contain a new-line character: id: nf-core-nanoseq-summary --- workflows/nanoseq.nf | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 7d765fe9..fd42720b 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -145,9 +145,6 @@ workflow NANOSEQ{ /* * SUBWORKFLOW: Read in samplesheet, validate and stage input files */ - left = Channel.from(['X', 1], ['Y', 2], ['Z', 3], ['P', 7]) - right= Channel.from(['Z', 6], ['Y', 5], ['X', 4]) - left.join(right).view() INPUT_CHECK ( ch_input ) .set { ch_sample } @@ -425,7 +422,7 @@ workflow NANOSEQ{ ch_featurecounts_gene_multiqc.ifEmpty([]), ch_featurecounts_transcript_multiqc.ifEmpty([]), CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), - ch_workflow_summary + ch_workflow_summary.collectFile(name: 'workflow_summary_mqc.yaml') ) } } From 670bab4cc55934dd798062d448cc723f1907fde0 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 17 Dec 2021 15:42:14 +0800 Subject: [PATCH 021/169] update nf-core/nanoseq logos --- assets/nf-core-nanoseq_logo_light.png | Bin 428 -> 11262 bytes docs/images/nf-core-nanoseq_logo_dark.png | Bin 288 -> 75618 bytes docs/images/nf-core-nanoseq_logo_light.png | Bin 519 -> 75499 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/nf-core-nanoseq_logo_light.png b/assets/nf-core-nanoseq_logo_light.png index d46347c2d217dd9a7c090367c55a068226f937c1..313219c02d7587b9c038c117657fd994c571051d 100644 GIT binary patch literal 11262 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 literal 428 zcmZ`#K~BRk5WM>pOV3aj5H~9lG(l7

J-waT~81OO72jb}RoLJM9sUyE8jGGwP=P zT({r52Hx8DE$sF$+szslcT#Se_EpNdtuM&KawTQ+v8aUV!(c1b6Y4w!6D(Cvt4H`E zKADbS@9>1i;=z)V7g#7c)78Q2R21&3KiPRN)L6AW!IagA!AuZn7(F8!n;^O(3&GEL z`IdZS!SoYp3ZUbR4QN~-hc4sVpItBmfoJG&#Lk2yM)p}|n3k}!gi}7^1bED6U@;Ic zl^ka$&sv*cyhCf#Eg<}pQxJ33KjQ@CIv?|QCJpD_6tkR+I~LC|e?kXMA=kc(1G!N4 VJvv>8IrcTl)qtG)%H@^D#V=*Sk$eCE diff --git a/docs/images/nf-core-nanoseq_logo_dark.png b/docs/images/nf-core-nanoseq_logo_dark.png index dee3db82069b61e9a5380d940355f47ff565057c..408f9afcabdb7d677992732f35979138abb9d40a 100644 GIT binary patch literal 75618 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%0D6Aha9ZZvy3Owj0R@{kHIA1_W(q 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 QwgSyWD-BsM+%TVX=zX#so# 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�ev`Q}H7y#R1zKkC5n?0_OP7^FqWWeXhX0t0pNK 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

)bNtXB<>| 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 Date: Fri, 17 Dec 2021 19:03:00 +0800 Subject: [PATCH 022/169] remove warnings from conf/modules.config --- conf/modules.config | 84 ++++++++++++++++++++++++++++----------------- 1 file changed, 52 insertions(+), 32 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index 3f0e1632..cca63e60 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -128,21 +128,31 @@ if (!params.skip_alignment) { } if (params.aligner == "graphmap2") { process { - withName: SAMTOOLS_SORT { - publishDir = [ - path: { "${params.outdir}/graphmap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: SAMTOOLS_INDEX { - publishDir = [ - path: { "${params.outdir}/graphmap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + if (!params.call_variants){ + withName: SAMTOOLS_SORT { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_INDEX { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } else { + withName: SAMTOOLS_SORT_INDEX { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - withName: BAM_STATS_SAMTOOLS { + withName: NFCORE_NANOSEQ:NANOSEQ:BAM_SORT_INDEX_SAMTOOLS:BAM_STATS_SAMTOOLS { publishDir = [ path: { "${params.outdir}/graphmap2/samtools_stats" }, mode: 'copy', @@ -152,7 +162,7 @@ if (!params.skip_alignment) { } if (!params.skip_bigbed) { process { - withName: BEDTOOLS_UCSC_BIGBED { + withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGBED { publishDir = [ path: { "${params.outdir}/graphmap2/bigbed" }, mode: 'copy', @@ -163,7 +173,7 @@ if (!params.skip_alignment) { } if (!params.skip_bigwig) { process { - withName: BEDTOOLS_UCSC_BIGWIG { + withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGWIG { publishDir = [ path: { "${params.outdir}/graphmap2/bigwig" }, mode: 'copy', @@ -175,21 +185,31 @@ if (!params.skip_alignment) { } if (params.aligner == "minimap2") { process { - withName: SAMTOOLS_SORT { - publishDir = [ - path: { "${params.outdir}/minimap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: SAMTOOLS_INDEX { - publishDir = [ - path: { "${params.outdir}/minimap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] + if (!params.call_variants){ + withName: SAMTOOLS_SORT { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_INDEX { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } else { + withName: SAMTOOLS_SORT_INDEX { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } } - withName: BAM_STATS_SAMTOOLS { + withName: NFCORE_NANOSEQ:NANOSEQ:BAM_SORT_INDEX_SAMTOOLS:BAM_STATS_SAMTOOLS { publishDir = [ path: { "${params.outdir}/minimap2/samtools_stats" }, mode: 'copy', @@ -199,7 +219,7 @@ if (!params.skip_alignment) { } if (!params.skip_bigbed) { process { - withName: BEDTOOLS_UCSC_BIGBED { + withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGBED { publishDir = [ path: { "${params.outdir}/minimap2/bigbed" }, mode: 'copy', @@ -210,7 +230,7 @@ if (!params.skip_alignment) { } if (!params.skip_bigwig) { process { - withName: BEDTOOLS_UCSC_BIGWIG { + withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGWIG { publishDir = [ path: { "${params.outdir}/minimap2/bigwig" }, mode: 'copy', From 6102586c54bbbc089e0a14a2ec4ba897fae4096a Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 17 Dec 2021 17:33:45 +0100 Subject: [PATCH 023/169] New configuration to tidy results folder --- conf/modules.config | 208 ++++++++++++++++++++++++++++++++------------ 1 file changed, 153 insertions(+), 55 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index cca63e60..a490834e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -14,7 +14,8 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: 'copy', + mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] @@ -23,15 +24,17 @@ process { publishDir = [ path: { "${params.outdir}/pipeline_info" }, mode: 'copy', + enabled: true, pattern: '*_versions.yml' ] } // INPUT_CHECK - withName: 'NFCORE_NANOSEQ:NANOSEQ:INPUT_CHECK:SAMPLESHEET_CHECK' { + withName: SAMPLESHEET_CHECK { publishDir = [ path: { "${params.outdir}/pipeline_info" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -43,6 +46,7 @@ if (!params.skip_basecalling) { publishDir = [ path: { "${params.outdir}/guppy" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -55,6 +59,7 @@ if (params.skip_basecalling && !params.skip_demultiplexing) { publishDir = [ path: { "${params.outdir}/qcat" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -67,6 +72,7 @@ if (params.run_nanolyse) { publishDir = [ path: { "${params.outdir}/nanolyse" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -80,6 +86,7 @@ if (!params.skip_qc) { publishDir = [ path: { "${params.outdir}/pycoqc" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -91,6 +98,7 @@ if (!params.skip_qc) { publishDir = [ path: { "${params.outdir}/nanoplot" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -102,6 +110,7 @@ if (!params.skip_qc) { publishDir = [ path: { "${params.outdir}/fastqc" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -115,6 +124,7 @@ if (!params.skip_alignment) { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -122,50 +132,70 @@ if (!params.skip_alignment) { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } if (params.aligner == "graphmap2") { process { - if (!params.call_variants){ - withName: SAMTOOLS_SORT { - publishDir = [ - path: { "${params.outdir}/graphmap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: SAMTOOLS_INDEX { - publishDir = [ - path: { "${params.outdir}/graphmap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } else { - withName: SAMTOOLS_SORT_INDEX { - publishDir = [ - path: { "${params.outdir}/graphmap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } + withName: SAMTOOLS_SORT { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] } - withName: NFCORE_NANOSEQ:NANOSEQ:BAM_SORT_INDEX_SAMTOOLS:BAM_STATS_SAMTOOLS { + withName: SAMTOOLS_VIEW_BAM { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_INDEX { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + enabled: true, + pattern: "*{'.sorted.bam','.bai'}", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_STATS { + publishDir = [ + path: { "${params.outdir}/graphmap2/samtools_stats" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_IDXSTATS { + publishDir = [ + path: { "${params.outdir}/graphmap2/samtools_stats" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_FLAGSTAT { publishDir = [ path: { "${params.outdir}/graphmap2/samtools_stats" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } if (!params.skip_bigbed) { process { - withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGBED { + withName: UCSC_BED12TOBIGBED { publishDir = [ path: { "${params.outdir}/graphmap2/bigbed" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -173,56 +203,102 @@ if (!params.skip_alignment) { } if (!params.skip_bigwig) { process { - withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGWIG { + withName: BEDTOOLS_GENOMECOV { publishDir = [ path: { "${params.outdir}/graphmap2/bigwig" }, mode: 'copy', + enabled: true, + pattern: "*bedGraph", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - } - } - if (params.aligner == "minimap2") { - process { - if (!params.call_variants){ - withName: SAMTOOLS_SORT { - publishDir = [ - path: { "${params.outdir}/minimap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - withName: SAMTOOLS_INDEX { - publishDir = [ - path: { "${params.outdir}/minimap2" }, - mode: 'copy', - saveAs: { filename -> filename.equals('versions.yml') ? null : filename } - ] - } - } else { - withName: SAMTOOLS_SORT_INDEX { + process { + withName: UCSC_BEDGRAPHTOBIGWIG { publishDir = [ - path: { "${params.outdir}/minimap2" }, + path: { "${params.outdir}/graphmap2/bigwig" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } - withName: NFCORE_NANOSEQ:NANOSEQ:BAM_SORT_INDEX_SAMTOOLS:BAM_STATS_SAMTOOLS { + } + } + if (params.aligner == "minimap2") { + process { + withName: MINIMAP2_ALIGN { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: MINIMAP2_INDEX { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_SORT { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_VIEW_BAM { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_INDEX { + publishDir = [ + path: { "${params.outdir}/minimap2" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_STATS { + publishDir = [ + path: { "${params.outdir}/minimap2/samtools_stats" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_IDXSTATS { + publishDir = [ + path: { "${params.outdir}/minimap2/samtools_stats" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_FLAGSTAT { publishDir = [ path: { "${params.outdir}/minimap2/samtools_stats" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } } if (!params.skip_bigbed) { process { - withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGBED { + withName: UCSC_BED12TOBIGBED { publishDir = [ path: { "${params.outdir}/minimap2/bigbed" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -230,10 +306,22 @@ if (!params.skip_alignment) { } if (!params.skip_bigwig) { process { - withName: NFCORE_NANOSEQ:NANOSEQ:BEDTOOLS_UCSC_BIGWIG { + withName: BEDTOOLS_GENOMECOV { + publishDir = [ + path: { "${params.outdir}/minimap2/bigwig" }, + mode: 'copy', + enabled: true, + pattern: "*bedGraph", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: UCSC_BEDGRAPHTOBIGWIG { publishDir = [ path: { "${params.outdir}/minimap2/bigwig" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -247,8 +335,9 @@ if (params.call_variants) { process { withName: MEDAKA_VARIANT { publishDir = [ - path: { "${params.outdir}/DNA_variant_calling/medaka_variant" }, + path: { "${params.outdir}/dna_variant_calling/medaka_variant" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -258,8 +347,9 @@ if (params.call_variants) { process { withName: SNIFFLES { publishDir = [ - path: { "${params.outdir}/DNA_variant_calling/sniffles" }, + path: { "${params.outdir}/dna_variant_calling/sniffles" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -274,6 +364,7 @@ if (!params.skip_quantification) { publishDir = [ path: { "${params.outdir}/bambu" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -284,6 +375,7 @@ if (!params.skip_quantification) { publishDir = [ path: { "${params.outdir}/bambu/deseq2" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -291,6 +383,7 @@ if (!params.skip_quantification) { publishDir = [ path: { "${params.outdir}/bambu/dexseq" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -303,6 +396,7 @@ if (!params.skip_quantification) { publishDir = [ path: { "${params.outdir}/stringtie2" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -310,6 +404,7 @@ if (!params.skip_quantification) { publishDir = [ path: { "${params.outdir}/stringtie2/featureCounts" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -320,6 +415,7 @@ if (!params.skip_quantification) { publishDir = [ path: { "${params.outdir}/bambu/deseq2" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -327,6 +423,7 @@ if (!params.skip_quantification) { publishDir = [ path: { "${params.outdir}/bambu/dexseq" }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -345,6 +442,7 @@ if (!params.skip_multiqc) { params.skip_alignment? '' : "/${params.aligner}" ].join('') }, mode: 'copy', + enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } From 755584eaf526c368f756e877a9a7b51cac7848ed Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Sat, 18 Dec 2021 22:19:51 +0800 Subject: [PATCH 024/169] update conf/modules.config --- conf/modules.config | 88 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 81 insertions(+), 7 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index a490834e..e422a8b2 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -28,7 +28,14 @@ process { pattern: '*_versions.yml' ] } - + withName: GET_TEST_DATA { + publishDir = [ + path: { "${params.outdir}/test-dataset" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } // INPUT_CHECK withName: SAMPLESHEET_CHECK { publishDir = [ @@ -67,6 +74,14 @@ if (params.skip_basecalling && !params.skip_demultiplexing) { } if (params.run_nanolyse) { + withName: GET_NANOLYSE_FASTA { + publishDir = [ + path: { "${params.outdir}/nanolyse" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } process { withName: NANOLYSE { publishDir = [ @@ -139,7 +154,15 @@ if (!params.skip_alignment) { } if (params.aligner == "graphmap2") { process { - withName: SAMTOOLS_SORT { + withName: GRAPHMAP2_INDEX { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: GRAPHMAP2_ALIGN { publishDir = [ path: { "${params.outdir}/graphmap2" }, mode: 'copy', @@ -155,7 +178,25 @@ if (!params.skip_alignment) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } + withName: SAMTOOLS_SORT { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + enabled: true, + pattern: "*.sorted.bam", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } withName: SAMTOOLS_INDEX { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + enabled: true, + pattern: "*.bai", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_SORT_INDEX { publishDir = [ path: { "${params.outdir}/graphmap2" }, mode: 'copy', @@ -191,11 +232,21 @@ if (!params.skip_alignment) { } if (!params.skip_bigbed) { process { + withName: BEDTOOLS_BAMBED { + publishDir = [ + path: { "${params.outdir}/graphmap2/bigbed" }, + mode: 'copy', + enabled: true, + pattern: "*.bed12", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } withName: UCSC_BED12TOBIGBED { publishDir = [ path: { "${params.outdir}/graphmap2/bigbed" }, mode: 'copy', enabled: true, + pattern: "*.bigBed", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -219,6 +270,7 @@ if (!params.skip_alignment) { path: { "${params.outdir}/graphmap2/bigwig" }, mode: 'copy', enabled: true, + pattern: "*bigWig", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -227,7 +279,7 @@ if (!params.skip_alignment) { } if (params.aligner == "minimap2") { process { - withName: MINIMAP2_ALIGN { + withName: MINIMAP2_INDEX { publishDir = [ path: { "${params.outdir}/minimap2" }, mode: 'copy', @@ -235,7 +287,7 @@ if (!params.skip_alignment) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: MINIMAP2_INDEX { + withName: MINIMAP2_ALIGN { publishDir = [ path: { "${params.outdir}/minimap2" }, mode: 'copy', @@ -243,7 +295,7 @@ if (!params.skip_alignment) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SAMTOOLS_SORT { + withName: SAMTOOLS_VIEW_BAM { publishDir = [ path: { "${params.outdir}/minimap2" }, mode: 'copy', @@ -251,11 +303,12 @@ if (!params.skip_alignment) { saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } - withName: SAMTOOLS_VIEW_BAM { + withName: SAMTOOLS_SORT { publishDir = [ path: { "${params.outdir}/minimap2" }, mode: 'copy', - enabled: false, + enabled: true, + pattern: "*.sorted.bam", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -264,6 +317,16 @@ if (!params.skip_alignment) { path: { "${params.outdir}/minimap2" }, mode: 'copy', enabled: true, + pattern: "*.bai", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_SORT_INDEX { + publishDir = [ + path: { "${params.outdir}/graphmap2" }, + mode: 'copy', + enabled: true, + pattern: "*{'.sorted.bam','.bai'}", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -294,11 +357,21 @@ if (!params.skip_alignment) { } if (!params.skip_bigbed) { process { + withName: BEDTOOLS_BAMBED { + publishDir = [ + path: { "${params.outdir}/minimap2/bigbed" }, + mode: 'copy', + enabled: true, + pattern: "*.bed12", + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } withName: UCSC_BED12TOBIGBED { publishDir = [ path: { "${params.outdir}/minimap2/bigbed" }, mode: 'copy', enabled: true, + pattern: "*.bigBed", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -322,6 +395,7 @@ if (!params.skip_alignment) { path: { "${params.outdir}/minimap2/bigwig" }, mode: 'copy', enabled: true, + pattern: "*.bigWig", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } From 4bffca2c06a20761ae82d02280401e53886441b9 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Sat, 18 Dec 2021 22:23:48 +0800 Subject: [PATCH 025/169] fix linting error --- conf/modules.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/modules.config b/conf/modules.config index e422a8b2..b7cf744d 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -14,7 +14,7 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: 'copy', + mode: 'copy', enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] From 5e2e897256a4982c8164be9f09ff767f44052414 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Mon, 20 Dec 2021 15:41:28 +0100 Subject: [PATCH 026/169] Update output.md Update variant calling output documentation --- docs/output.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/output.md b/docs/output.md index 67030f6a..b25d8657 100644 --- a/docs/output.md +++ b/docs/output.md @@ -202,6 +202,22 @@ After genomic alignment, novel transcripts can be reconstructed using tools such *Description*: If multiple conditions and multiple replicates are available then the pipeline is able to run differential analysis on gene and transcripts with DESeq2 and DEXSeq, respectively. These steps won't be run if you provide the `--skip_quantification` or `--skip_differential_analysis` parameters or if all of the samples in the samplesheet don't have the same fasta and GTF reference files. +## Variant calling + +

+Output files + +* `minimap2/medaka//round_1.vcf ` + VCF file with small variants for each sample. +* `minimap2/sniffles/_sniffles.vcf` + VCF files with unflitered structural variants. + +*Documentation*: +[Medaka](https://github.com/nanoporetech/medaka), [Sniffles](https://github.com/fritzsedlazeck/Sniffles) + +*Description*: +If the protocol is set to `--protocol DNA` and the *Minimap2* aligner was used, then the `--call_variants` parameter can be envoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. + ## MultiQC
From 18bb9537bde81ad719769fecf8fbff80e87e2d08 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Mon, 20 Dec 2021 15:42:37 +0100 Subject: [PATCH 027/169] Update output.md Fix format error --- docs/output.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/output.md b/docs/output.md index b25d8657..cff5ab21 100644 --- a/docs/output.md +++ b/docs/output.md @@ -212,6 +212,8 @@ If multiple conditions and multiple replicates are available then the pipeline i * `minimap2/sniffles/_sniffles.vcf` VCF files with unflitered structural variants. +
+ *Documentation*: [Medaka](https://github.com/nanoporetech/medaka), [Sniffles](https://github.com/fritzsedlazeck/Sniffles) From ce5ead26e14375d26ba6d25f89aa6757686803bc Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Mon, 20 Dec 2021 15:43:39 +0100 Subject: [PATCH 028/169] Update output.md Correct spelling mistake --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index cff5ab21..9b498c7e 100644 --- a/docs/output.md +++ b/docs/output.md @@ -218,7 +218,7 @@ If multiple conditions and multiple replicates are available then the pipeline i [Medaka](https://github.com/nanoporetech/medaka), [Sniffles](https://github.com/fritzsedlazeck/Sniffles) *Description*: -If the protocol is set to `--protocol DNA` and the *Minimap2* aligner was used, then the `--call_variants` parameter can be envoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. +If the protocol is set to `--protocol DNA` and the *Minimap2* aligner was used, then the `--call_variants` parameter can be invoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. ## MultiQC From 7e5c5b0ea560dc9de09684fa70f43d1a8ec5024a Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Mon, 20 Dec 2021 15:45:46 +0100 Subject: [PATCH 029/169] Update output.md Fix linting error --- docs/output.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/output.md b/docs/output.md index 9b498c7e..2cf5c222 100644 --- a/docs/output.md +++ b/docs/output.md @@ -207,7 +207,7 @@ If multiple conditions and multiple replicates are available then the pipeline i
Output files -* `minimap2/medaka//round_1.vcf ` +* `minimap2/medaka//round_1.vcf` VCF file with small variants for each sample. * `minimap2/sniffles/_sniffles.vcf` VCF files with unflitered structural variants. From 4df1c70b71c30eba79ad5149ee165df2cc1d914d Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Tue, 21 Dec 2021 08:37:16 +0800 Subject: [PATCH 030/169] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0de86232..19d14b8b 100644 --- a/README.md +++ b/README.md @@ -90,7 +90,7 @@ An example input samplesheet for performing both basecalling and demultiplexing ## Credits -nf-core/nanoseq was originally written by [Chelsea Sawyer](https://github.com/csawye01) and [Harshil Patel](https://github.com/drpatelh) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) for use at [The Francis Crick Institute](https://www.crick.ac.uk/), London. Other primary contributors include [Laura Wratten](https://github.com/lwratten), [Ying Chen](https://github.com/cying111), [Yuk Kei Wan](https://github.com/yuukiiwa) and [Jonathan Goeke](https://github.com/jonathangoeke) from the [Genome Institute of Singapore](https://www.a-star.edu.sg/gis), [Johannes Alneberg](https://github.com/alneberg) and [Franziska Bonath](https://github.com/FranBonath) from [SciLifeLab](https://www.scilifelab.se/), Sweden. +nf-core/nanoseq was originally written by [Chelsea Sawyer](https://github.com/csawye01) and [Harshil Patel](https://github.com/drpatelh) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) for use at [The Francis Crick Institute](https://www.crick.ac.uk/), London. Other primary contributors include [Laura Wratten](https://github.com/lwratten), [Ying Chen](https://github.com/cying111), [Yuk Kei Wan](https://github.com/yuukiiwa) and [Jonathan Goeke](https://github.com/jonathangoeke) from the [Genome Institute of Singapore](https://www.a-star.edu.sg/gis), [Christopher Hakkaart](https://github.com/christopher-hakkaart) from [Institute of Medical Genetics and Applied Genomics](https://www.medizin.uni-tuebingen.de/de/das-klinikum/einrichtungen/institute/medizinische-genetik-und-angewandte-genomik), Germany, [Johannes Alneberg](https://github.com/alneberg) and [Franziska Bonath](https://github.com/FranBonath) from [SciLifeLab](https://www.scilifelab.se/), Sweden. Many thanks to others who have helped out along the way too, including (but not limited to): [@crickbabs](https://github.com/crickbabs), [@AnnaSyme](https://github.com/AnnaSyme). From 2c939e84af38f9c80787ea6eaaeb4fe60261e0f5 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Tue, 21 Dec 2021 13:00:38 +0800 Subject: [PATCH 031/169] update CHANGELOG --- CHANGELOG.md | 32 ++++++++++++++++++++++++++++++++ modules/local/bambu.nf | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35bb59c2..207ee578 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,38 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [3.0.0] - ? + +### Major enhancements + +* Add DNA variant calling functionality +* Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules + * Removed `--publish_dir_mode` as it is no longer required for the new syntax +* Bump minimum Nextflow version from 21.04.0 -> 21.10.3 +* Update pipeline template to nf-core/tools `2.2` +* Update `bambu` version from `1.0.2` to `2.0.0` + +### Parameters + +* Added `--call_variants` to detect DNA variants +* Added `--split_mnps` to +* Added `--phase_vcf` to +* Added `--skip_medaka` to skip `medaka variant` +* Added `--skip_sniffles` to skip `sniffles` + +### Software dependencies + +| Dependency | Old version | New version | +|-------------------------|-------------|-------------| +| `bioconductor-bambu` | 1.0.2 | 2.0.0 | +| `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | +| `medaka` | | 1.4.4 | +| `sniffles` | | 1.0.12 | + +> **NB:** Dependency has been __updated__ if both old and new version information is present. +> **NB:** Dependency has been __added__ if just the new version information is present. +> **NB:** Dependency has been __removed__ if version information isn't present. + ## [2.0.1] - 2021-11-29 ### Bug fix diff --git a/modules/local/bambu.nf b/modules/local/bambu.nf index 599e351f..6fe8b3e5 100644 --- a/modules/local/bambu.nf +++ b/modules/local/bambu.nf @@ -1,7 +1,7 @@ process BAMBU { label 'process_medium' - conda (params.enable_conda ? "conda-forge::r-base=4.0.3 bioconda::bioconductor-bambu=2.0.0 bioconda::bioconductor-bsgenome=1.58.0" : null) + conda (params.enable_conda ? "conda-forge::r-base=4.0.3 bioconda::bioconductor-bambu=2.0.0 bioconda::bioconductor-bsgenome=1.62.0" : null) container "docker.io/yuukiiwa/nanoseq:bambu_bsgenome" //not on biocontainers; does not have a singularity container input: From 447806f4f71eb7362cd93054d93785dddf4bf323 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Tue, 21 Dec 2021 13:03:08 +0800 Subject: [PATCH 032/169] Update CHANGELOG.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 207ee578..bc2325aa 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 ### Parameters * Added `--call_variants` to detect DNA variants -* Added `--split_mnps` to +* Added `--split_mnps` to * Added `--phase_vcf` to * Added `--skip_medaka` to skip `medaka variant` * Added `--skip_sniffles` to skip `sniffles` From 0d25fa4a9f409c99365a316421c7f0546fbdd687 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Tue, 21 Dec 2021 13:28:14 +0800 Subject: [PATCH 033/169] add DNA-specific downstream analysis --- README.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 19d14b8b..eb3510f8 100644 --- a/README.md +++ b/README.md @@ -41,12 +41,14 @@ On release, automated continuous integration tests run the pipeline on a [full-s * Each sample can be mapped to its own reference genome if multiplexed in this way * Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation -7. RNA-specific downstream analysis: +7. DNA-specific downstream analysis: + * DNA variant calling ([`medaka`](https://github.com/nanoporetech/medaka) and/or [`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) +8. RNA-specific downstream analysis: * Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) * bambu performs both transcript reconstruction and quantification. * When StringTie2 is chosen, each sample can be processed individually and combined. After which, [`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/) will be used for both gene and transcript quantification. - * Differential expression analysis ([`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html) or [`DEXSeq`](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html)) -8. Present QC for raw read and alignment results ([`MultiQC`](https://multiqc.info/docs/)) + * Differential expression analysis ([`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html) and/or [`DEXSeq`](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html)) +9. Present QC for raw read and alignment results ([`MultiQC`](https://multiqc.info/docs/)) ## Quick Start From 3c76d9306fb161f443c4f78a9ff4decfc765fb7e Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Tue, 21 Dec 2021 13:34:29 +0100 Subject: [PATCH 034/169] Update CHANGELOG.md Added descriptions of DNA variant calling parameters --- CHANGELOG.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bc2325aa..447ad1be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,9 +17,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameters * Added `--call_variants` to detect DNA variants -* Added `--split_mnps` to -* Added `--phase_vcf` to -* Added `--skip_medaka` to skip `medaka variant` +* Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms +* Added `--phase_vcf` to output a phased vcf +* Added `--skip_medaka` to skip `medaka_variant` * Added `--skip_sniffles` to skip `sniffles` ### Software dependencies From 46b92ef2615cc31254416b3f3c9fbb99c65970a3 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 22 Dec 2021 22:59:10 +0100 Subject: [PATCH 035/169] Update test_nobc_nodx_vc.config Moved input to nfcore test-datasets --- conf/test_nobc_nodx_vc.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index b8463f9a..98a1cda3 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip basecalling and demultiplexing, and variant call - input = 'https://raw.githubusercontent.com//christopher-hakkaart/testdata/main/samplesheet_nobc_vc.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_vc.csv' protocol = 'DNA' skip_basecalling = true skip_quantification = true From 4e3dc8316c2a0d0c7337ea9411b2ccd33df1ce92 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Thu, 23 Dec 2021 10:07:41 +0100 Subject: [PATCH 036/169] Update test_nobc_nodx_vc.config Fix late night typo --- conf/test_nobc_nodx_vc.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 98a1cda3..10c15217 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip basecalling and demultiplexing, and variant call - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_vc.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_vc.csv' protocol = 'DNA' skip_basecalling = true skip_quantification = true From d49b7635e8d24c2e56ec4b285fb3dcc2c14859f8 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Thu, 23 Dec 2021 12:25:17 +0100 Subject: [PATCH 037/169] Update multiqc.nf Update multiqc to fix conda error --- modules/local/multiqc.nf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/multiqc.nf b/modules/local/multiqc.nf index 44d8ca11..7f9cbfda 100644 --- a/modules/local/multiqc.nf +++ b/modules/local/multiqc.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? "bioconda::multiqc=1.10.1" : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.10.1--pyhdfd78af_1' : - 'quay.io/biocontainers/multiqc:1.10.1--pyhdfd78af_1' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" input: path ch_multiqc_config From 4afd54c081ee004cc048dcc0810d95659e722ff4 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Thu, 23 Dec 2021 12:29:46 +0100 Subject: [PATCH 038/169] Update CHANGELOG.md Update multiqc to fix conda error --- CHANGELOG.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 447ad1be..e642ae5e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -13,6 +13,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Bump minimum Nextflow version from 21.04.0 -> 21.10.3 * Update pipeline template to nf-core/tools `2.2` * Update `bambu` version from `1.0.2` to `2.0.0` +* Update `multiqc` version from `1.10.1` to `1.11` ### Parameters @@ -29,6 +30,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `bioconductor-bambu` | 1.0.2 | 2.0.0 | | `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | | `medaka` | | 1.4.4 | +| `multiqc` | 1.10.1 | 1.11 | | `sniffles` | | 1.0.12 | > **NB:** Dependency has been __updated__ if both old and new version information is present. From 93d02f483cd6150ad2f131d3b5c16ab8ee0c8af2 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Thu, 23 Dec 2021 12:32:38 +0100 Subject: [PATCH 039/169] Update modules.config Fix output folder name and save sorted bam and bai --- conf/modules.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index b7cf744d..82716142 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -323,10 +323,10 @@ if (!params.skip_alignment) { } withName: SAMTOOLS_SORT_INDEX { publishDir = [ - path: { "${params.outdir}/graphmap2" }, + path: { "${params.outdir}/minimap2" }, mode: 'copy', enabled: true, - pattern: "*{'.sorted.bam','.bai'}", + pattern: "*.{sorted.bam,sorted.bam.bai}", saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } From ae2dcb4551c20421f375e270399af6b7c3eef033 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 24 Dec 2021 12:02:24 +0800 Subject: [PATCH 040/169] add RNA fusion --- bin/JAFFAL.groovy | 80 ++++++++++++++++++++++++ bin/create_yml.py | 38 +++++++++++ conf/modules.config | 30 +++++++++ modules.json | 3 + modules/local/get_jaffal_ref.nf | 17 +++++ modules/local/jaffal.nf | 23 +++++++ modules/nf-core/modules/untar/main.nf | 28 +++++++++ modules/nf-core/modules/untar/meta.yml | 28 +++++++++ nextflow.config | 9 +++ nextflow_schema.json | 49 +++++++++++++++ subworkflows/local/rna_fusions_jaffal.nf | 34 ++++++++++ workflows/nanoseq.nf | 9 +++ 12 files changed, 348 insertions(+) create mode 100644 bin/JAFFAL.groovy create mode 100644 bin/create_yml.py create mode 100644 modules/local/get_jaffal_ref.nf create mode 100644 modules/local/jaffal.nf create mode 100644 modules/nf-core/modules/untar/main.nf create mode 100644 modules/nf-core/modules/untar/meta.yml create mode 100644 subworkflows/local/rna_fusions_jaffal.nf diff --git a/bin/JAFFAL.groovy b/bin/JAFFAL.groovy new file mode 100644 index 00000000..aff0541b --- /dev/null +++ b/bin/JAFFAL.groovy @@ -0,0 +1,80 @@ +/*********************************************************** + ** This is the JAFFA pipeline file for fusion detection + ** with noisy long read data. For polished long read data, + ** use JAFFA_direct.groovy. Run like so: + ** bpipe run + ** See our website for details on running options: + ** https://github.com/Oshlack/JAFFA/wiki. + ** + ** Author: Nadia Davidson + ** Last Update: 2021 + *********************************************************/ + +codeBase = file(bpipe.Config.config.script).parentFile.absolutePath +load codeBase+"/JAFFA_stages.groovy" + +get_fasta = { + doc "Converting fastqs to fasta" + output.dir=jaffa_output+branch + produce(branch+".fasta"){ + exec "$reformat threads=16 ignorebadquality=t in=$input out=$output ;" + } +} + +minimap2_transcriptome = { + doc "Aligning candidates to transcriptome using minimap2" + output.dir=jaffa_output+branch + produce(branch+".paf"){ + exec """ + $minimap2 -t 16 -x map-ont -c $transFasta $input > $output1 ; + """ + } +} + +/** CODE NOT USED infer_genome_alignment = { + doc "Bypassing genomic alignment and infering genome position from transcriptome alignments" + output.dir=jaffa_output+branch + produce(branch+"_genome.psl"){ + exec """ + $bypass_genomic_alignment $transTable $input.txt > $output + """ + } +}**/ + +minimap2_genome = { + doc "Aligning candidates to genome using minimap2" + output.dir=jaffa_output+branch + produce(branch+"_genome.paf",branch+"_genome.psl"){ + exec """ + $minimap2 -t 16 -x splice -c $genomeFasta $input > $output1 ; + grep \$'\\t+\\t' $output1 | awk -F'\\t' -v OFS="\\t" '{ print \$4-\$3,0,0,0,0,0,0,0,\$5,\$1,\$2,\$3,\$4,\$6,\$7,\$8,\$9,2, 100","\$4-\$3-100",",\$3","\$3+100",", \$8","\$9-\$4+\$3+100"," }' > $output2 ; + grep \$'\\t-\\t' $output1 | awk -F'\\t' -v OFS="\\t" '{ print \$4-\$3,0,0,0,0,0,0,0,\$5,\$1,\$2,\$3,\$4,\$6,\$7,\$8,\$9,2, 100","\$4-\$3-100",", \$2-\$4","\$2-\$4+100",", \$8","\$9-\$4+\$3+100"," }' >> $output2 + """ + } +} + +reassign_dist=50 + +readLayout="single" +fastqInputFormat="%.gz" + +common_steps = segment { + minimap2_transcriptome + + filter_transcripts + + extract_fusion_sequences + + // infer_genome_alignment + + minimap2_genome + + make_fasta_reads_table + + get_final_list } + + +// below is the pipeline for a fasta file +if(args[0].endsWith(fastaSuffix)) { + run { run_check + fastaInputFormat * [ + common_steps ] + compile_all_results + } +} else { //or fastq.gz will be converted to fasta. + run { run_check + fastqInputFormat * [ + get_fasta + common_steps ] + compile_all_results + } +} diff --git a/bin/create_yml.py b/bin/create_yml.py new file mode 100644 index 00000000..f5d5ff0a --- /dev/null +++ b/bin/create_yml.py @@ -0,0 +1,38 @@ +#!/usr/bin/env python + +import sys +outfile_name=sys.argv[1] +samples=sys.argv[2:] +outfile=open(outfile_name,"w") +outfile.write( + 'notes: Pairwise comparison without replicates with default parameter setting.'+ '\n'+ + '\n'+ + 'data:'+'\n' +) + +dict={} +for sample in samples: + sample=sample.strip("[").strip("]").split(",") + path_to_sample,condition=sample[0],sample[1] + if condition not in dict: + dict[condition]=[path_to_sample] + else: + dict[condition].append(path_to_sample) + +for condition in dict: + outfile.write(' '+condition+':'+'\n') + r=0 + for sample in dict[condition]: + r+=1 + outfile.write(' rep'+str(r)+': '+sample+'/xpore'+'\n') + +outfile.write('\n'+'out: ./diffmod_outputs'+'\n'+'\n') + +outfile.write( + 'method:'+'\n'+ + ' prefiltering:'+'\n'+ + ' method: t-test'+'\n'+ + ' threshold: 0.1'+'\n'+'\n' +) + +outfile.close() diff --git a/conf/modules.config b/conf/modules.config index 82716142..6b4ecdb5 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -506,6 +506,36 @@ if (!params.skip_quantification) { } } +if (!params.skip_fusion_analysis) { + process { + withName: GET_JAFFAL_REF { + publishDir = [ + path: { "${params.outdir}/jaffal" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: UNTAR { + publishDir = [ + path: { "${params.outdir}/jaffal" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: JAFFAL { + publishDir = [ + path: { "${params.outdir}/jaffal" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + +} + if (!params.skip_multiqc) { process { withName: MULTIQC { diff --git a/modules.json b/modules.json index 77d36baa..a623d7f1 100644 --- a/modules.json +++ b/modules.json @@ -32,6 +32,9 @@ }, "stringtie/merge": { "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + }, + "untar": { + "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } diff --git a/modules/local/get_jaffal_ref.nf b/modules/local/get_jaffal_ref.nf new file mode 100644 index 00000000..16c96b82 --- /dev/null +++ b/modules/local/get_jaffal_ref.nf @@ -0,0 +1,17 @@ +process GET_JAFFAL_REF { + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" + + output: + path "for_jaffal.tar.gz" , emit: ch_jaffal_ref + + script: + """ + curl \\ + -L https://ndownloader.figshare.com/files/28168755 \\ + -o for_jaffal.tar.gz + """ +} diff --git a/modules/local/jaffal.nf b/modules/local/jaffal.nf new file mode 100644 index 00000000..7828b071 --- /dev/null +++ b/modules/local/jaffal.nf @@ -0,0 +1,23 @@ +process JAFFAL { + tag "$meta.id" + echo true + label 'process_medium' + +// conda (params.enable_conda ? "bioconda::nanolyse=1.2.0" : null) //need conda container + container "docker.io/yuukiiwa/jaffa:2.0" + + input: + tuple val(meta), path(fastq) + path jaffal_ref_dir + + output: + tuple val(meta), path("*.fasta") ,emit: jaffal_fastq + path "*.csv" ,emit: jaffal_results + path "*_version.txt" ,emit: version + + script: + """ + bpipe run -p refBase=$jaffal_ref_dir $jaffal_ref_dir/JAFFAL.groovy $fastq + echo '2.0' > jaffal_version.txt + """ +} diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf new file mode 100644 index 00000000..4d2c3a31 --- /dev/null +++ b/modules/nf-core/modules/untar/main.nf @@ -0,0 +1,28 @@ +process UNTAR { + label 'process_low' + + conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : + 'biocontainers/biocontainers:v1.2.0_cv1' }" + + input: + path archive + + output: + path "$untar" , emit: untar + path "versions.yml", emit: versions + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + untar = archive.toString() - '.tar.gz' + """ + tar -xzvf $args $archive $args2 + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml new file mode 100644 index 00000000..51f94995 --- /dev/null +++ b/modules/nf-core/modules/untar/meta.yml @@ -0,0 +1,28 @@ +name: untar +description: Extract files. +keywords: + - untar + - uncompress +tools: + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ['GPL-3.0-or-later'] +input: + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" +output: + - untar: + type: file + description: + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" diff --git a/nextflow.config b/nextflow.config index ef2ce0d0..23e6398c 100644 --- a/nextflow.config +++ b/nextflow.config @@ -57,6 +57,15 @@ params { skip_quantification = false skip_differential_analysis = false + // Options: RNA modification analysis + skip_modification_analysis = false + skip_xpore = false + skip_m6anet = false + + // Options: RNA fusion analysis + skip_fusion_analysis = false + jaffal_ref_dir = null + // Options: QC skip_qc = false skip_pycoqc = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 60dce87b..2a696f9f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -250,6 +250,49 @@ } } }, + "rna_fusion_analysis_options": { + "title": "RNA fusion analysis options", + "type": "object", + "description": "Options to adjust the RNA fusion analysis", + "fa_icon": "fas fa-calculator", + "properties": { + "jaffal_ref_dir": { + "type": "string", + "default": "for_jaffal", + "description": "Specifies the reference directory for JAFFAL.", + "fa_icon": "fas fa-bezier-curve" + }, + "skip_fusion_analysis": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip differential analysis with DESeq2 and DEXSeq." + } + } + }, + "rna_modification_analysis_options": { + "title": "RNA modification analysis options", + "type": "object", + "description": "Options to adjust the RNA modification analysis", + "default": "", + "fa_icon": "fas fa-calculator", + "properties": { + "skip_modification_analysis": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip RNA modification analysis." + }, + "skip_xpore": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip differential modification analysis with xpore." + }, + "skip_m6anet": { + "type": "boolean", + "fa_icon": "fas fa-fast-forward", + "description": "Skip m6A detection with m6anet." + } + } + }, "process_skipping_options": { "title": "Process skipping options", "type": "object", @@ -493,6 +536,12 @@ { "$ref": "#/definitions/differential_analysis_options" }, + { + "$ref": "#/definitions/rna_fusion_analysis_options" + }, + { + "$ref": "#/definitions/rna_modification_analysis_options" + }, { "$ref": "#/definitions/process_skipping_options" }, diff --git a/subworkflows/local/rna_fusions_jaffal.nf b/subworkflows/local/rna_fusions_jaffal.nf new file mode 100644 index 00000000..82170568 --- /dev/null +++ b/subworkflows/local/rna_fusions_jaffal.nf @@ -0,0 +1,34 @@ +include { GET_JAFFAL_REF } from '../../modules/local/get_jaffal_ref' +include { UNTAR } from '../../modules/nf-core/modules/untar/main' +include { JAFFAL } from '../../modules/local/jaffal' + +workflow RNA_FUSIONS_JAFFAL { + take: + ch_sample + jaffal_ref_dir + + main: + + if (jaffal_ref_dir) { + ch_jaffal_ref_dir = file(params.jaffal_ref_dir, checkIfExists: true) + } else { + GET_JAFFAL_REF() + UNTAR( GET_JAFFAL_REF.out.ch_jaffal_ref ) + ch_jaffal_ref_dir = UNTAR.out.untar + } + ch_jaffal_ref_dir.view() + + ch_sample + .map { it -> [ it[0], it[6] ]} + .set { ch_jaffal_input } + + /* + * Align current signals to reference with Nanopolish + */ + JAFFAL( ch_jaffal_input, ch_jaffal_ref_dir ) + +// emit: +// ch_nanopolish_outputs +// ch_dataprep_dirs +// nanopolish_version +} diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index fd42720b..48781c9e 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -118,6 +118,7 @@ include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtool include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' include { DIFFERENTIAL_DESEQ2_DEXSEQ } from '../subworkflows/local/differential_deseq2_dexseq' +include { RNA_FUSIONS_JAFFAL } from '../subworkflows/local/rna_fusions_jaffal' //////////////////////////////////////////////////// /* -- IMPORT NF-CORE MODULES/SUBWORKFLOWS -- */ @@ -399,6 +400,14 @@ workflow NANOSEQ{ } } + if (!params.skip_fusion_analysis && (params.protocol == 'cDNA' || params.protocol == 'directRNA')) { + + /* + * SUBWORKFLOW: RNA_FUSIONS_JAFFAL + */ + RNA_FUSIONS_JAFFAL( ch_sample, params.jaffal_ref_dir ) + } + /* * MODULE: Parse software version numbers */ From fa8757db703bfc65c69934033a4f5c02ebd2724f Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 24 Dec 2021 23:29:31 +0800 Subject: [PATCH 041/169] fix linting error --- bin/.Rhistory | 0 bin/JAFFAL.groovy | 86 ++++++++++++------------ bin/create_yml.py | 36 +++++----- modules/local/jaffal.nf | 2 +- subworkflows/local/.Rhistory | 0 subworkflows/local/rna_fusions_jaffal.nf | 12 ++-- 6 files changed, 68 insertions(+), 68 deletions(-) create mode 100644 bin/.Rhistory create mode 100644 subworkflows/local/.Rhistory diff --git a/bin/.Rhistory b/bin/.Rhistory new file mode 100644 index 00000000..e69de29b diff --git a/bin/JAFFAL.groovy b/bin/JAFFAL.groovy index aff0541b..5866ef13 100644 --- a/bin/JAFFAL.groovy +++ b/bin/JAFFAL.groovy @@ -1,6 +1,6 @@ /*********************************************************** ** This is the JAFFA pipeline file for fusion detection - ** with noisy long read data. For polished long read data, + ** with noisy long read data. For polished long read data, ** use JAFFA_direct.groovy. Run like so: ** bpipe run ** See our website for details on running options: @@ -14,43 +14,43 @@ codeBase = file(bpipe.Config.config.script).parentFile.absolutePath load codeBase+"/JAFFA_stages.groovy" get_fasta = { - doc "Converting fastqs to fasta" - output.dir=jaffa_output+branch - produce(branch+".fasta"){ - exec "$reformat threads=16 ignorebadquality=t in=$input out=$output ;" - } + doc "Converting fastqs to fasta" + output.dir=jaffa_output+branch + produce(branch+".fasta"){ + exec "$reformat threads=16 ignorebadquality=t in=$input out=$output ;" + } } minimap2_transcriptome = { - doc "Aligning candidates to transcriptome using minimap2" - output.dir=jaffa_output+branch - produce(branch+".paf"){ - exec """ - $minimap2 -t 16 -x map-ont -c $transFasta $input > $output1 ; - """ - } + doc "Aligning candidates to transcriptome using minimap2" + output.dir=jaffa_output+branch + produce(branch+".paf"){ + exec """ + $minimap2 -t 16 -x map-ont -c $transFasta $input > $output1 ; + """ + } } /** CODE NOT USED infer_genome_alignment = { - doc "Bypassing genomic alignment and infering genome position from transcriptome alignments" - output.dir=jaffa_output+branch - produce(branch+"_genome.psl"){ - exec """ - $bypass_genomic_alignment $transTable $input.txt > $output - """ - } + doc "Bypassing genomic alignment and infering genome position from transcriptome alignments" + output.dir=jaffa_output+branch + produce(branch+"_genome.psl"){ + exec """ + $bypass_genomic_alignment $transTable $input.txt > $output + """ + } }**/ minimap2_genome = { - doc "Aligning candidates to genome using minimap2" - output.dir=jaffa_output+branch - produce(branch+"_genome.paf",branch+"_genome.psl"){ - exec """ - $minimap2 -t 16 -x splice -c $genomeFasta $input > $output1 ; - grep \$'\\t+\\t' $output1 | awk -F'\\t' -v OFS="\\t" '{ print \$4-\$3,0,0,0,0,0,0,0,\$5,\$1,\$2,\$3,\$4,\$6,\$7,\$8,\$9,2, 100","\$4-\$3-100",",\$3","\$3+100",", \$8","\$9-\$4+\$3+100"," }' > $output2 ; - grep \$'\\t-\\t' $output1 | awk -F'\\t' -v OFS="\\t" '{ print \$4-\$3,0,0,0,0,0,0,0,\$5,\$1,\$2,\$3,\$4,\$6,\$7,\$8,\$9,2, 100","\$4-\$3-100",", \$2-\$4","\$2-\$4+100",", \$8","\$9-\$4+\$3+100"," }' >> $output2 - """ - } + doc "Aligning candidates to genome using minimap2" + output.dir=jaffa_output+branch + produce(branch+"_genome.paf",branch+"_genome.psl"){ + exec """ + $minimap2 -t 16 -x splice -c $genomeFasta $input > $output1 ; + grep \$'\\t+\\t' $output1 | awk -F'\\t' -v OFS="\\t" '{ print \$4-\$3,0,0,0,0,0,0,0,\$5,\$1,\$2,\$3,\$4,\$6,\$7,\$8,\$9,2, 100","\$4-\$3-100",",\$3","\$3+100",", \$8","\$9-\$4+\$3+100"," }' > $output2 ; + grep \$'\\t-\\t' $output1 | awk -F'\\t' -v OFS="\\t" '{ print \$4-\$3,0,0,0,0,0,0,0,\$5,\$1,\$2,\$3,\$4,\$6,\$7,\$8,\$9,2, 100","\$4-\$3-100",", \$2-\$4","\$2-\$4+100",", \$8","\$9-\$4+\$3+100"," }' >> $output2 + """ + } } reassign_dist=50 @@ -58,23 +58,23 @@ reassign_dist=50 readLayout="single" fastqInputFormat="%.gz" -common_steps = segment { - minimap2_transcriptome + - filter_transcripts + - extract_fusion_sequences + - // infer_genome_alignment + - minimap2_genome + - make_fasta_reads_table + - get_final_list } +common_steps = segment { + minimap2_transcriptome + + filter_transcripts + + extract_fusion_sequences + + // infer_genome_alignment + + minimap2_genome + + make_fasta_reads_table + + get_final_list } // below is the pipeline for a fasta file if(args[0].endsWith(fastaSuffix)) { - run { run_check + fastaInputFormat * [ - common_steps ] + compile_all_results - } + run { run_check + fastaInputFormat * [ + common_steps ] + compile_all_results + } } else { //or fastq.gz will be converted to fasta. - run { run_check + fastqInputFormat * [ - get_fasta + common_steps ] + compile_all_results - } + run { run_check + fastqInputFormat * [ + get_fasta + common_steps ] + compile_all_results + } } diff --git a/bin/create_yml.py b/bin/create_yml.py index f5d5ff0a..33c818cb 100644 --- a/bin/create_yml.py +++ b/bin/create_yml.py @@ -5,34 +5,34 @@ samples=sys.argv[2:] outfile=open(outfile_name,"w") outfile.write( - 'notes: Pairwise comparison without replicates with default parameter setting.'+ '\n'+ - '\n'+ - 'data:'+'\n' + 'notes: Pairwise comparison without replicates with default parameter setting.'+ '\n'+ + '\n'+ + 'data:'+'\n' ) dict={} for sample in samples: - sample=sample.strip("[").strip("]").split(",") - path_to_sample,condition=sample[0],sample[1] - if condition not in dict: - dict[condition]=[path_to_sample] - else: - dict[condition].append(path_to_sample) + sample=sample.strip("[").strip("]").split(",") + path_to_sample,condition=sample[0],sample[1] + if condition not in dict: + dict[condition]=[path_to_sample] + else: + dict[condition].append(path_to_sample) for condition in dict: - outfile.write(' '+condition+':'+'\n') - r=0 - for sample in dict[condition]: - r+=1 - outfile.write(' rep'+str(r)+': '+sample+'/xpore'+'\n') + outfile.write(' '+condition+':'+'\n') + r=0 + for sample in dict[condition]: + r+=1 + outfile.write(' rep'+str(r)+': '+sample+'/xpore'+'\n') outfile.write('\n'+'out: ./diffmod_outputs'+'\n'+'\n') outfile.write( - 'method:'+'\n'+ - ' prefiltering:'+'\n'+ - ' method: t-test'+'\n'+ - ' threshold: 0.1'+'\n'+'\n' + 'method:'+'\n'+ + ' prefiltering:'+'\n'+ + ' method: t-test'+'\n'+ + ' threshold: 0.1'+'\n'+'\n' ) outfile.close() diff --git a/modules/local/jaffal.nf b/modules/local/jaffal.nf index 7828b071..ea31478d 100644 --- a/modules/local/jaffal.nf +++ b/modules/local/jaffal.nf @@ -9,7 +9,7 @@ process JAFFAL { input: tuple val(meta), path(fastq) path jaffal_ref_dir - + output: tuple val(meta), path("*.fasta") ,emit: jaffal_fastq path "*.csv" ,emit: jaffal_results diff --git a/subworkflows/local/.Rhistory b/subworkflows/local/.Rhistory new file mode 100644 index 00000000..e69de29b diff --git a/subworkflows/local/rna_fusions_jaffal.nf b/subworkflows/local/rna_fusions_jaffal.nf index 82170568..e957ee18 100644 --- a/subworkflows/local/rna_fusions_jaffal.nf +++ b/subworkflows/local/rna_fusions_jaffal.nf @@ -11,7 +11,7 @@ workflow RNA_FUSIONS_JAFFAL { if (jaffal_ref_dir) { ch_jaffal_ref_dir = file(params.jaffal_ref_dir, checkIfExists: true) - } else { + } else { GET_JAFFAL_REF() UNTAR( GET_JAFFAL_REF.out.ch_jaffal_ref ) ch_jaffal_ref_dir = UNTAR.out.untar @@ -19,13 +19,13 @@ workflow RNA_FUSIONS_JAFFAL { ch_jaffal_ref_dir.view() ch_sample - .map { it -> [ it[0], it[6] ]} - .set { ch_jaffal_input } + .map { it -> [ it[0], it[6] ]} + .set { ch_jaffal_input } /* - * Align current signals to reference with Nanopolish - */ - JAFFAL( ch_jaffal_input, ch_jaffal_ref_dir ) + * Align current signals to reference with Nanopolish + */ + JAFFAL( ch_jaffal_input, ch_jaffal_ref_dir ) // emit: // ch_nanopolish_outputs From 2a34861829ef27129882b9258e692c062fecd238 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 27 Dec 2021 15:09:19 +0800 Subject: [PATCH 042/169] add nanopolish, xpore, and m6anet --- bin/.Rhistory | 0 bin/JAFFAL.groovy | 0 bin/check_samplesheet.py | 30 ++++++++-- bin/create_yml.py | 2 +- conf/modules.config | 54 +++++++++++++++++ conf/test_nobc_nodx_rnamod.config | 27 +++++++++ modules/local/m6anet_dataprep.nf | 21 +++++++ modules/local/m6anet_inference.nf | 26 ++++++++ modules/local/nanopolish_index_eventalign.nf | 29 +++++++++ modules/local/xpore_dataprep.nf | 22 +++++++ modules/local/xpore_diffmod.nf | 25 ++++++++ nextflow.config | 11 ++-- subworkflows/local/.Rhistory | 0 subworkflows/local/input_check.nf | 4 +- .../local/rna_modifications_xpore_m6anet.nf | 60 +++++++++++++++++++ workflows/nanoseq.nf | 11 ++++ 16 files changed, 309 insertions(+), 13 deletions(-) delete mode 100644 bin/.Rhistory mode change 100644 => 100755 bin/JAFFAL.groovy mode change 100644 => 100755 bin/create_yml.py create mode 100644 conf/test_nobc_nodx_rnamod.config create mode 100644 modules/local/m6anet_dataprep.nf create mode 100644 modules/local/m6anet_inference.nf create mode 100644 modules/local/nanopolish_index_eventalign.nf create mode 100644 modules/local/xpore_dataprep.nf create mode 100644 modules/local/xpore_diffmod.nf delete mode 100644 subworkflows/local/.Rhistory create mode 100644 subworkflows/local/rna_modifications_xpore_m6anet.nf diff --git a/bin/.Rhistory b/bin/.Rhistory deleted file mode 100644 index e69de29b..00000000 diff --git a/bin/JAFFAL.groovy b/bin/JAFFAL.groovy old mode 100644 new mode 100755 diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 96aef752..9abff9d7 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -97,14 +97,34 @@ def check_samplesheet(file_in, file_out): if input_file: if input_file.find(" ") != -1: print_error("Input file contains spaces!", 'Line', line) - if not input_file.endswith(".fastq.gz") and not input_file.endswith(".fq.gz") and not input_file.endswith(".bam"): - print_error("Input file does not have extension '.fastq.gz', '.fq.gz' or '.bam'!", 'Line', line) if input_file.endswith(".fastq.gz"): input_extensions.append("*.fastq.gz") elif input_file.endswith(".fq.gz"): input_extensions.append("*.fq.gz") elif input_file.endswith(".bam"): input_extensions.append("*.bam") + else: + list_dir = os.listdir(input_file) + nanopolish_fast5 = input_file + if not (all(fname.endswith('.fast5') for fname in list_dir)): + if "fast5" in list_dir and "fastq" in list_dir: + nanopolish_fast5 = input_file+'/fast5' + ## CHECK FAST5 DIRECTORY + if not (all(fname.endswith('.fast5') for fname in os.listdir(nanopolish_fast5))): + print_error('fast5 directory contains non-fast5 files.') + ## CHECK PROVIDED BASECALLED FASTQ + fastq_path = input_file+'/fastq' + basecalled_fastq = [fn for fn in os.listdir(fastq_path) if fn.endswith(".fastq.gz") or fn.endswith(".fq.gz") ] + print(basecalled_fastq) + if len(basecalled_fastq) != 1: + print_error('Please input one basecalled fastq per sample.') + else: + input_file = fastq_path+'/'+basecalled_fastq[0] + if not basecalled_fastq[0].endswith(".fastq.gz"): + if not basecalled_fastq[0].endswith(".fq.gz"): + print_error('basecalled fastq input does not end with ".fastq.gz" or ".fq.gz"') + else: + print_error('path does not end with ".fastq.gz", ".fq.gz", or ".bam" and is not an existing directory with correct fast5 and/or fastq inputs.') ## Check genome entries if genome: @@ -130,8 +150,8 @@ def check_samplesheet(file_in, file_out): is_transcripts = '1' genome = transcriptome - ## Create sample mapping dictionary = {group: {replicate : [ barcode, input_file, genome, gtf, is_transcripts ]}} - sample_info = [barcode, input_file, genome, gtf, is_transcripts] + ## Create sample mapping dictionary = {group: {replicate : [ barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5 ]}} + sample_info = [barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5] if group not in sample_info_dict: sample_info_dict[group] = {} if replicate not in sample_info_dict[group]: @@ -149,7 +169,7 @@ def check_samplesheet(file_in, file_out): make_dir(out_dir) with open(file_out, "w") as fout: - fout.write(",".join(['sample', 'barcode', 'input_file', 'genome', 'gtf', 'is_transcripts']) + "\n") + fout.write(",".join(['sample', 'barcode', 'input_file', 'genome', 'gtf', 'is_transcripts', 'nanopolish_fast5']) + "\n") for sample in sorted(sample_info_dict.keys()): ## Check that replicate ids are in format 1.. diff --git a/bin/create_yml.py b/bin/create_yml.py old mode 100644 new mode 100755 index 33c818cb..9c9034bf --- a/bin/create_yml.py +++ b/bin/create_yml.py @@ -24,7 +24,7 @@ r=0 for sample in dict[condition]: r+=1 - outfile.write(' rep'+str(r)+': '+sample+'/xpore'+'\n') + outfile.write(' rep'+str(r)+': '+sample+'\n') outfile.write('\n'+'out: ./diffmod_outputs'+'\n'+'\n') diff --git a/conf/modules.config b/conf/modules.config index 6b4ecdb5..3693dee0 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -536,6 +536,60 @@ if (!params.skip_fusion_analysis) { } +if (!params.skip_modification_analysis) { + process { + withName: NANOPOLISH_INDEX_EVENTALIGN { + publishDir = [ + path: { "${params.outdir}/rna_modifications/nanopolish" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + if (!params.skip_xpore) { + process { + withName: XPORE_DATAPREP { + publishDir = [ + path: { "${params.outdir}/rna_modifications/xpore/dataprep" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: XPORE_DIFFMOD { + publishDir = [ + path: { "${params.outdir}/rna_modifications/xpore/diffmod" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + if (!params.skip_m6anet) { + process { + withName: M6ANET_DATAPREP { + publishDir = [ + path: { "${params.outdir}/rna_modifications/m6anet/dataprep" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: M6ANET_INFERENCE { + publishDir = [ + path: { "${params.outdir}/rna_modifications/m6anet/inference" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } +} + + if (!params.skip_multiqc) { process { withName: MULTIQC { diff --git a/conf/test_nobc_nodx_rnamod.config b/conf/test_nobc_nodx_rnamod.config new file mode 100644 index 00000000..d4b18ac7 --- /dev/null +++ b/conf/test_nobc_nodx_rnamod.config @@ -0,0 +1,27 @@ +/* + * ------------------------------------------------- + * Nextflow config file for running tests + * ------------------------------------------------- + * Defines bundled input files and everything required + * to run a fast and simple test. Use as follows: + * nextflow run nf-core/nanoseq -profile test_nobc_nodx, + */ + +params { + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' + + // Limit resources so that this can run on Travis + max_cpus = 8 + max_memory = 6.GB + max_time = 12.h + + // Input data to skip both basecalling and demultiplexing + input = '/home/wanyk/add_mod/samplesheet.csv' + protocol = 'directRNA' + skip_basecalling = true + skip_demultiplexing = true + skip_quantification = true + skip_fusion_analysis= true +} + diff --git a/modules/local/m6anet_dataprep.nf b/modules/local/m6anet_dataprep.nf new file mode 100644 index 00000000..492c867b --- /dev/null +++ b/modules/local/m6anet_dataprep.nf @@ -0,0 +1,21 @@ +process M6ANET_DATAPREP { + tag "$meta.id" + label 'process_medium' + +// conda (params.enable_conda ? "bioconda::nanopolish==0.13.2" : null) // need to get xpore onto conda + container "docker.io/yuukiiwa/m6anet:1.0" + + input: + tuple val(meta), path(genome), path(gtf), path(eventalign), path(nanopolish_summary) + + output: + tuple val(meta), path("$meta.id"), emit: dataprep_outputs + + script: + """ + m6anet-dataprep \\ + --eventalign $eventalign \\ + --out_dir $meta.id \\ + --n_processes $params.max_cpus + """ +} diff --git a/modules/local/m6anet_inference.nf b/modules/local/m6anet_inference.nf new file mode 100644 index 00000000..68a66a70 --- /dev/null +++ b/modules/local/m6anet_inference.nf @@ -0,0 +1,26 @@ +process M6ANET_INFERENCE { + tag "$meta.id" + echo true + label 'process_medium' + +// conda (params.enable_conda ? "bioconda::nanopolish==0.13.2" : null) // need to get xpore onto conda + container "docker.io/yuukiiwa/m6anet:1.0" + + input: + tuple val(meta), path(input_dir) + + output: + path "*", emit: m6anet_outputs + path "versions.yml" , emit: versions + + script: + def out_dir = meta.id+"_results" + """ + m6anet-run_inference --input_dir $input_dir --out_dir $out_dir --batch_size 512 --n_processes $params.max_cpus --num_iterations 5 --device cpu + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + m6anet: \$( echo 'm6anet 1.0' ) + END_VERSIONS + """ +} diff --git a/modules/local/nanopolish_index_eventalign.nf b/modules/local/nanopolish_index_eventalign.nf new file mode 100644 index 00000000..4a48bd18 --- /dev/null +++ b/modules/local/nanopolish_index_eventalign.nf @@ -0,0 +1,29 @@ +process NANOPOLISH_INDEX_EVENTALIGN { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::nanopolish==0.13.2" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/nanopolish:0.13.2--he3b7ca5_2' : + 'quay.io/biocontainers/nanopolish:0.13.2--he3b7ca5_2' }" + + input: + tuple val(meta), path(genome), path(gtf), path(fast5), path(fastq), path(bam), path(bai) + + output: + tuple val(meta), path(genome), path(gtf), path("*eventalign.txt"), path("*summary.txt"), emit: nanopolish_outputs + path "versions.yml" , emit: versions + + script: + sample_summary = "$meta.id" +"_summary.txt" + sample_eventalign = "$meta.id" +"_eventalign.txt" + """ + nanopolish index -d $fast5 $fastq + nanopolish eventalign --reads $fastq --bam $bam --genome $genome --scale-events --signal-index --summary $sample_summary --threads $params.guppy_cpu_threads > $sample_eventalign + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + nanopolish: \$( nanopolish --version | sed -e 's/nanopolish version //g' ) + END_VERSIONS + """ +} diff --git a/modules/local/xpore_dataprep.nf b/modules/local/xpore_dataprep.nf new file mode 100644 index 00000000..a0911f4b --- /dev/null +++ b/modules/local/xpore_dataprep.nf @@ -0,0 +1,22 @@ +process XPORE_DATAPREP { + tag "$meta.id" + label 'process_medium' + +// conda (params.enable_conda ? "bioconda::nanopolish==0.13.2" : null) // need to get xpore onto conda + container "docker.io/yuukiiwa/xpore:2.1" + + input: + tuple val(meta), path(genome), path(gtf), path(eventalign), path(nanopolish_summary) + + output: + tuple val(meta), path("$meta.id"), emit: dataprep_outputs + + script: + """ + xpore dataprep \\ + --eventalign $eventalign \\ + --out_dir $meta.id \\ + --n_processes $params.max_cpus \\ + --genome --gtf_or_gff $gtf --transcript_fasta $genome + """ +} diff --git a/modules/local/xpore_diffmod.nf b/modules/local/xpore_diffmod.nf new file mode 100644 index 00000000..6b732343 --- /dev/null +++ b/modules/local/xpore_diffmod.nf @@ -0,0 +1,25 @@ +process XPORE_DIFFMOD { + label 'process_medium' + +// conda (params.enable_conda ? "bioconda::nanopolish==0.13.2" : null) // need to get xpore onto conda + container "docker.io/yuukiiwa/xpore:2.1" + + input: + val dataprep_dirs + + output: + path "diffmod*", emit: diffmod_outputs + path "versions.yml" , emit: versions + + script: + diffmod_config = "--config $workflow.workDir/*/*/diffmod_config.yml" + """ + create_yml.py diffmod_config.yml $dataprep_dirs + xpore diffmod $diffmod_config --n_processes $params.max_cpus + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + xpore: \$( xpore --version | sed -e 's/xpore version //g' ) + END_VERSIONS + """ +} diff --git a/nextflow.config b/nextflow.config index 23e6398c..8f202499 100644 --- a/nextflow.config +++ b/nextflow.config @@ -175,11 +175,12 @@ profiles { } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } - test_bc_nodx { includeConfig 'conf/test_bc_nodx.config' } - test_nobc_dx { includeConfig 'conf/test_nobc_dx.config' } - test_nobc_nodx { includeConfig 'conf/test_nobc_nodx.config' } - test_nobc_nodx_noaln { includeConfig 'conf/test_nobc_nodx_noaln.config' } - test_nobc_nodx_vc { includeConfig 'conf/test_nobc_nodx_vc.config' } + test_bc_nodx { includeConfig 'conf/test_bc_nodx.config' } + test_nobc_dx { includeConfig 'conf/test_nobc_dx.config' } + test_nobc_nodx { includeConfig 'conf/test_nobc_nodx.config' } + test_nobc_nodx_noaln { includeConfig 'conf/test_nobc_nodx_noaln.config' } + test_nobc_nodx_vc { includeConfig 'conf/test_nobc_nodx_vc.config' } + test_nobc_nodx_rnamod { includeConfig 'conf/test_nobc_nodx_rnamod.config' } } // Load igenomes.config if required diff --git a/subworkflows/local/.Rhistory b/subworkflows/local/.Rhistory deleted file mode 100644 index e69de29b..00000000 diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index a7031cbc..e4ec4bf1 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -21,7 +21,7 @@ workflow INPUT_CHECK { } // Function to resolve fasta and gtf file if using iGenomes -// Returns [ sample, input_file, barcode, fasta, gtf, is_transcripts, annotation_str ] +// Returns [ sample, input_file, barcode, fasta, gtf, is_transcripts, annotation_str, nanopolish_fast5 ] def get_sample_info(LinkedHashMap sample, LinkedHashMap genomeMap) { def meta = [:] meta.id = sample.sample @@ -42,5 +42,5 @@ def get_sample_info(LinkedHashMap sample, LinkedHashMap genomeMap) { input_file = sample.input_file ? file(sample.input_file, checkIfExists: true) : null gtf = sample.gtf ? file(sample.gtf, checkIfExists: true) : gtf - return [ meta, input_file, sample.barcode, fasta, gtf, sample.is_transcripts.toBoolean(), fasta.toString()+';'+gtf.toString() ] + return [ meta, input_file, sample.barcode, fasta, gtf, sample.is_transcripts.toBoolean(), fasta.toString()+';'+gtf.toString(), sample.nanopolish_fast5 ] } diff --git a/subworkflows/local/rna_modifications_xpore_m6anet.nf b/subworkflows/local/rna_modifications_xpore_m6anet.nf new file mode 100644 index 00000000..5cdebfb0 --- /dev/null +++ b/subworkflows/local/rna_modifications_xpore_m6anet.nf @@ -0,0 +1,60 @@ +include { NANOPOLISH_INDEX_EVENTALIGN } from '../../modules/local/nanopolish_index_eventalign' +include { XPORE_DATAPREP } from '../../modules/local/xpore_dataprep' +include { XPORE_DIFFMOD } from '../../modules/local/xpore_diffmod' +include { M6ANET_DATAPREP } from '../../modules/local/m6anet_dataprep' +include { M6ANET_INFERENCE } from '../../modules/local/m6anet_inference' + +workflow RNA_MODIFICATION_XPORE_M6ANET { + take: + ch_sample + ch_nanopolish_sortbam + + main: + + ch_sample + .join(ch_nanopolish_sortbam) + .map { it -> [ it[0], it[2], it[3], it[7], it[6], it[8], it[9] ] } + .set { ch_nanopolish_input } + + /* + * Align current signals to reference with Nanopolish + */ + NANOPOLISH_INDEX_EVENTALIGN { ch_nanopolish_input } + ch_nanopolish_outputs = NANOPOLISH_INDEX_EVENTALIGN.out.nanopolish_outputs + nanopolish_version = NANOPOLISH_INDEX_EVENTALIGN.out.versions + + xpore_version = '' + if (!params.skip_xpore) { + XPORE_DATAPREP( ch_nanopolish_outputs ) + ch_xpore_dataprep_dirs = XPORE_DATAPREP.out.dataprep_outputs + ch_xpore_dataprep_dirs + .map{ it -> it[1]+','+it[0].id } + .set{ ch_xpore_diffmod_inputs } + /* + * Differential modification expression with xpore + */ + XPORE_DIFFMOD{ ch_xpore_diffmod_inputs.collect() } + xpore_version = XPORE_DIFFMOD.out.versions + } + + /* + * Detect m6A sites with m6anet + */ + m6anet_version = '' + if (!params.skip_m6anet) { + /* + * Detect m6A sites with m6anet + */ + M6ANET_DATAPREP( ch_nanopolish_outputs ) + ch_m6anet_dataprep_dirs = M6ANET_DATAPREP.out.dataprep_outputs + M6ANET_INFERENCE{ ch_m6anet_dataprep_dirs } + m6anet_version = M6ANET_INFERENCE.out.versions + } + + emit: + ch_nanopolish_outputs + nanopolish_version + ch_xpore_dataprep_dirs + xpore_version + m6anet_version +} diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 48781c9e..7d938351 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -118,6 +118,7 @@ include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtool include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' include { DIFFERENTIAL_DESEQ2_DEXSEQ } from '../subworkflows/local/differential_deseq2_dexseq' +include { RNA_MODIFICATION_XPORE_M6ANET } from '../subworkflows/local/rna_modifications_xpore_m6anet' include { RNA_FUSIONS_JAFFAL } from '../subworkflows/local/rna_fusions_jaffal' //////////////////////////////////////////////////// @@ -337,6 +338,9 @@ workflow NANOSEQ{ ch_view_sortbam .map { it -> [ it[0], it[3] ] } .set { ch_sortbam } + ch_view_sortbam + .map { it -> [ it[0], it[3], it[4] ] } + .set { ch_nanopolish_sortbam } } else { ch_sample .map { it -> if (it[6].toString().endsWith('.bam')) [ it[0], it[6] ] } @@ -400,6 +404,13 @@ workflow NANOSEQ{ } } + if (!params.skip_modification_analysis && params.protocol == 'directRNA') { + /* + * SUBWORKFLOW: RNA modification detection with xPore and m6anet + */ + RNA_MODIFICATION_XPORE_M6ANET( ch_sample, ch_nanopolish_sortbam ) + } + if (!params.skip_fusion_analysis && (params.protocol == 'cDNA' || params.protocol == 'directRNA')) { /* From 604984036c70a14c919ca2950c656edbb57f2ec1 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Tue, 28 Dec 2021 08:05:09 +0800 Subject: [PATCH 043/169] fix linting error --- bin/check_samplesheet.py | 1 + conf/test.config | 2 ++ conf/test_bc_nodx.config | 34 ++++++++++--------- conf/test_nobc_dx.config | 29 +++++++++------- conf/test_nobc_nodx.config | 24 +++++++------ conf/test_nobc_nodx_noaln.config | 26 +++++++------- modules/local/m6anet_inference.nf | 2 +- modules/local/nanopolish_index_eventalign.nf | 4 +-- modules/local/xpore_diffmod.nf | 2 +- .../local/rna_modifications_xpore_m6anet.nf | 6 ++-- 10 files changed, 71 insertions(+), 59 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 9abff9d7..5bc94163 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -94,6 +94,7 @@ def check_samplesheet(file_in, file_out): barcode = 'barcode%s' % (barcode.zfill(2)) ## Check input file extension + nanopolish_fast5 = '' if input_file: if input_file.find(" ") != -1: print_error("Input file contains spaces!", 'Line', line) diff --git a/conf/test.config b/conf/test.config index 3a3eecba..5321174c 100644 --- a/conf/test.config +++ b/conf/test.config @@ -27,6 +27,8 @@ params { barcode_kit = 'EXP-NBD103' run_nanolyse = true skip_quantification = true + skip_fusion_analysis= true + skip_modification_analysis=true // This variable is just for reference and isnt actually required for the tests // Files are downloaded and staged using the "GetTestData" process diff --git a/conf/test_bc_nodx.config b/conf/test_bc_nodx.config index fbce4026..35c53aea 100755 --- a/conf/test_bc_nodx.config +++ b/conf/test_bc_nodx.config @@ -8,23 +8,25 @@ */ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on Travis - max_cpus = 2 - max_memory = 6.GB - max_time = 12.h + // Limit resources so that this can run on Travis + max_cpus = 2 + max_memory = 6.GB + max_time = 12.h - // Input data to perform basecalling and to skip demultipexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_nodx.csv' - protocol = 'cDNA' - flowcell = 'FLO-MIN106' - kit = 'SQK-DCS108' - skip_demultiplexing = true - skip_quantification = true + // Input data to perform basecalling and to skip demultipexing + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_nodx.csv' + protocol = 'cDNA' + flowcell = 'FLO-MIN106' + kit = 'SQK-DCS108' + skip_demultiplexing = true + skip_quantification = true + skip_fusion_analysis= true + skip_modification_analysis=true - // This variable is just for reference and isnt actually required for the tests - // Files are downloaded and staged using the "GetTestData" process - input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/nonbarcoded/' + // This variable is just for reference and isnt actually required for the tests + // Files are downloaded and staged using the "GetTestData" process + input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/nonbarcoded/' } diff --git a/conf/test_nobc_dx.config b/conf/test_nobc_dx.config index 13da2296..2206f4ac 100755 --- a/conf/test_nobc_dx.config +++ b/conf/test_nobc_dx.config @@ -8,19 +8,22 @@ */ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on Travis - max_cpus = 2 - max_memory = 6.GB - max_time = 12.h + // Limit resources so that this can run on Travis + max_cpus = 2 + max_memory = 6.GB + max_time = 12.h + + // Input data to skip basecalling and to only perform demultipexing + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_dx.csv' + protocol = 'DNA' + barcode_kit = 'NBD103/NBD104' + input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fastq/nondemultiplexed/sample_nobc_dx.fastq.gz' + skip_basecalling = true + skip_quantification = true + skip_fusion_analysis= true + skip_modification_analysis=true - // Input data to skip basecalling and to only perform demultipexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_dx.csv' - protocol = 'DNA' - barcode_kit = 'NBD103/NBD104' - input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fastq/nondemultiplexed/sample_nobc_dx.fastq.gz' - skip_basecalling = true - skip_quantification = true } diff --git a/conf/test_nobc_nodx.config b/conf/test_nobc_nodx.config index cd7dc251..d46704a1 100755 --- a/conf/test_nobc_nodx.config +++ b/conf/test_nobc_nodx.config @@ -8,17 +8,19 @@ */ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on Travis - max_cpus = 2 - max_memory = 6.GB - max_time = 12.h + // Limit resources so that this can run on Travis + max_cpus = 2 + max_memory = 6.GB + max_time = 12.h - // Input data to skip both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx.csv' - protocol = 'directRNA' - skip_basecalling = true - skip_demultiplexing = true + // Input data to skip both basecalling and demultiplexing + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx.csv' + protocol = 'directRNA' + skip_basecalling = true + skip_demultiplexing = true + skip_fusion_analysis= true + skip_modification_analysis=true } diff --git a/conf/test_nobc_nodx_noaln.config b/conf/test_nobc_nodx_noaln.config index 2f82c5c7..bec8d2cc 100644 --- a/conf/test_nobc_nodx_noaln.config +++ b/conf/test_nobc_nodx_noaln.config @@ -8,18 +8,20 @@ */ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on Travis - max_cpus = 2 - max_memory = 6.GB - max_time = 12.h + // Limit resources so that this can run on Travis + max_cpus = 2 + max_memory = 6.GB + max_time = 12.h - // Input data to skip both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_noaln.csv' - protocol = 'directRNA' - skip_basecalling = true - skip_demultiplexing = true - skip_alignment = true + // Input data to skip both basecalling and demultiplexing + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_noaln.csv' + protocol = 'directRNA' + skip_basecalling = true + skip_demultiplexing = true + skip_alignment = true + skip_fusion_analysis= true + skip_modification_analysis=true } diff --git a/modules/local/m6anet_inference.nf b/modules/local/m6anet_inference.nf index 68a66a70..59828d73 100644 --- a/modules/local/m6anet_inference.nf +++ b/modules/local/m6anet_inference.nf @@ -8,7 +8,7 @@ process M6ANET_INFERENCE { input: tuple val(meta), path(input_dir) - + output: path "*", emit: m6anet_outputs path "versions.yml" , emit: versions diff --git a/modules/local/nanopolish_index_eventalign.nf b/modules/local/nanopolish_index_eventalign.nf index 4a48bd18..397a7d40 100644 --- a/modules/local/nanopolish_index_eventalign.nf +++ b/modules/local/nanopolish_index_eventalign.nf @@ -9,14 +9,14 @@ process NANOPOLISH_INDEX_EVENTALIGN { input: tuple val(meta), path(genome), path(gtf), path(fast5), path(fastq), path(bam), path(bai) - + output: tuple val(meta), path(genome), path(gtf), path("*eventalign.txt"), path("*summary.txt"), emit: nanopolish_outputs path "versions.yml" , emit: versions script: sample_summary = "$meta.id" +"_summary.txt" - sample_eventalign = "$meta.id" +"_eventalign.txt" + sample_eventalign = "$meta.id" +"_eventalign.txt" """ nanopolish index -d $fast5 $fastq nanopolish eventalign --reads $fastq --bam $bam --genome $genome --scale-events --signal-index --summary $sample_summary --threads $params.guppy_cpu_threads > $sample_eventalign diff --git a/modules/local/xpore_diffmod.nf b/modules/local/xpore_diffmod.nf index 6b732343..bbe1f99d 100644 --- a/modules/local/xpore_diffmod.nf +++ b/modules/local/xpore_diffmod.nf @@ -6,7 +6,7 @@ process XPORE_DIFFMOD { input: val dataprep_dirs - + output: path "diffmod*", emit: diffmod_outputs path "versions.yml" , emit: versions diff --git a/subworkflows/local/rna_modifications_xpore_m6anet.nf b/subworkflows/local/rna_modifications_xpore_m6anet.nf index 5cdebfb0..239383b7 100644 --- a/subworkflows/local/rna_modifications_xpore_m6anet.nf +++ b/subworkflows/local/rna_modifications_xpore_m6anet.nf @@ -12,9 +12,9 @@ workflow RNA_MODIFICATION_XPORE_M6ANET { main: ch_sample - .join(ch_nanopolish_sortbam) - .map { it -> [ it[0], it[2], it[3], it[7], it[6], it[8], it[9] ] } - .set { ch_nanopolish_input } + .join(ch_nanopolish_sortbam) + .map { it -> [ it[0], it[2], it[3], it[7], it[6], it[8], it[9] ] } + .set { ch_nanopolish_input } /* * Align current signals to reference with Nanopolish From 8029d704fc9a9ce93a224881ad2c805b85650786 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Tue, 28 Dec 2021 13:44:16 +0800 Subject: [PATCH 044/169] add tests for RNA modification detection --- bin/check_samplesheet.py | 7 +++- conf/test_nobc_nodx_rnamod.config | 26 ++++++------- modules/local/get_test_data.nf | 5 ++- modules/local/m6anet_dataprep.nf | 2 +- modules/local/m6anet_inference.nf | 2 +- modules/local/nanopolish_index_eventalign.nf | 2 +- modules/local/samplesheet_check.nf | 3 ++ modules/local/xpore_dataprep.nf | 2 +- modules/local/xpore_diffmod.nf | 2 +- subworkflows/local/input_check.nf | 3 +- workflows/nanoseq.nf | 39 +++++++++++++------- 11 files changed, 56 insertions(+), 37 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 5bc94163..075f1c2d 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -12,6 +12,7 @@ def parse_args(args=None): parser = argparse.ArgumentParser(description=Description, epilog=Epilog) parser.add_argument("FILE_IN", help="Input samplesheet file.") + parser.add_argument("UPDATED_PATH", help="Input path for test_nobc_nodx_rnamod") parser.add_argument("FILE_OUT", help="Output file.") return parser.parse_args(args) @@ -35,7 +36,7 @@ def print_error(error, context="Line", context_str=""): sys.exit(1) -def check_samplesheet(file_in, file_out): +def check_samplesheet(file_in, updated_path, file_out): """ This function checks that the samplesheet follows the following structure: @@ -105,6 +106,8 @@ def check_samplesheet(file_in, file_out): elif input_file.endswith(".bam"): input_extensions.append("*.bam") else: + if updated_path != "not_changed": + input_file='/'.join([updated_path,input_file.split("/")[-1]]) list_dir = os.listdir(input_file) nanopolish_fast5 = input_file if not (all(fname.endswith('.fast5') for fname in list_dir)): @@ -186,7 +189,7 @@ def check_samplesheet(file_in, file_out): def main(args=None): args = parse_args(args) - check_samplesheet(args.FILE_IN, args.FILE_OUT) + check_samplesheet(args.FILE_IN, args.UPDATED_PATH, args.FILE_OUT) if __name__ == '__main__': diff --git a/conf/test_nobc_nodx_rnamod.config b/conf/test_nobc_nodx_rnamod.config index d4b18ac7..93a0322f 100644 --- a/conf/test_nobc_nodx_rnamod.config +++ b/conf/test_nobc_nodx_rnamod.config @@ -8,20 +8,20 @@ */ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check pipeline function' + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check pipeline function' - // Limit resources so that this can run on Travis - max_cpus = 8 - max_memory = 6.GB - max_time = 12.h + // Limit resources so that this can run on Travis + max_cpus = 8 + max_memory = 6.GB + max_time = 12.h - // Input data to skip both basecalling and demultiplexing - input = '/home/wanyk/add_mod/samplesheet.csv' - protocol = 'directRNA' - skip_basecalling = true - skip_demultiplexing = true - skip_quantification = true - skip_fusion_analysis= true + // Input data to skip both basecalling and demultiplexing + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_rnamod.csv' + protocol = 'directRNA' + skip_basecalling = true + skip_demultiplexing = true + skip_quantification = true + skip_fusion_analysis= true } diff --git a/modules/local/get_test_data.nf b/modules/local/get_test_data.nf index a0b8f606..cbae1e95 100644 --- a/modules/local/get_test_data.nf +++ b/modules/local/get_test_data.nf @@ -2,10 +2,11 @@ process GET_TEST_DATA { container "docker.io/yuukiiwa/git:latest" output: - path "test-datasets/fast5/$barcoded" , emit: ch_input_path + path "test-datasets/$subdir/$barcoded" , emit: ch_input_path script: - barcoded = workflow.profile.contains('test_bc_nodx') ? "nonbarcoded" : "barcoded" + subdir = workflow.profile.contains('test_nobc_nodx_rnamod') ? "modification_fast5_fastq" : "fast5" + barcoded = (workflow.profile.contains('test_bc_nodx') || workflow.profile.contains('test_nobc_nodx_rnamod')) ? "nonbarcoded" : "barcoded" """ git clone https://github.com/nf-core/test-datasets.git --branch nanoseq --single-branch """ diff --git a/modules/local/m6anet_dataprep.nf b/modules/local/m6anet_dataprep.nf index 492c867b..fac6f257 100644 --- a/modules/local/m6anet_dataprep.nf +++ b/modules/local/m6anet_dataprep.nf @@ -16,6 +16,6 @@ process M6ANET_DATAPREP { m6anet-dataprep \\ --eventalign $eventalign \\ --out_dir $meta.id \\ - --n_processes $params.max_cpus + --n_processes $task.cpus """ } diff --git a/modules/local/m6anet_inference.nf b/modules/local/m6anet_inference.nf index 59828d73..b148b3ae 100644 --- a/modules/local/m6anet_inference.nf +++ b/modules/local/m6anet_inference.nf @@ -16,7 +16,7 @@ process M6ANET_INFERENCE { script: def out_dir = meta.id+"_results" """ - m6anet-run_inference --input_dir $input_dir --out_dir $out_dir --batch_size 512 --n_processes $params.max_cpus --num_iterations 5 --device cpu + m6anet-run_inference --input_dir $input_dir --out_dir $out_dir --batch_size 512 --n_processes $task.cpus --num_iterations 5 --device cpu cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/nanopolish_index_eventalign.nf b/modules/local/nanopolish_index_eventalign.nf index 397a7d40..6da46bae 100644 --- a/modules/local/nanopolish_index_eventalign.nf +++ b/modules/local/nanopolish_index_eventalign.nf @@ -19,7 +19,7 @@ process NANOPOLISH_INDEX_EVENTALIGN { sample_eventalign = "$meta.id" +"_eventalign.txt" """ nanopolish index -d $fast5 $fastq - nanopolish eventalign --reads $fastq --bam $bam --genome $genome --scale-events --signal-index --summary $sample_summary --threads $params.guppy_cpu_threads > $sample_eventalign + nanopolish eventalign --reads $fastq --bam $bam --genome $genome --scale-events --signal-index --summary $sample_summary --threads $task.cpus > $sample_eventalign cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/samplesheet_check.nf b/modules/local/samplesheet_check.nf index 9aaecf0c..ac092121 100644 --- a/modules/local/samplesheet_check.nf +++ b/modules/local/samplesheet_check.nf @@ -8,15 +8,18 @@ process SAMPLESHEET_CHECK { input: path samplesheet + val input_path output: path '*.csv' , emit: csv path "versions.yml", emit: versions script: // This script is bundled with the pipeline, in nf-core/nanoseq/bin/ + updated_path = workflow.profile.contains('test_nobc_nodx_rnamod') ? "$input_path" : "not_changed" """ check_samplesheet.py \\ $samplesheet \\ + $updated_path \\ samplesheet.valid.csv cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/xpore_dataprep.nf b/modules/local/xpore_dataprep.nf index a0911f4b..e347db36 100644 --- a/modules/local/xpore_dataprep.nf +++ b/modules/local/xpore_dataprep.nf @@ -16,7 +16,7 @@ process XPORE_DATAPREP { xpore dataprep \\ --eventalign $eventalign \\ --out_dir $meta.id \\ - --n_processes $params.max_cpus \\ + --n_processes $task.cpus \\ --genome --gtf_or_gff $gtf --transcript_fasta $genome """ } diff --git a/modules/local/xpore_diffmod.nf b/modules/local/xpore_diffmod.nf index bbe1f99d..bbc96405 100644 --- a/modules/local/xpore_diffmod.nf +++ b/modules/local/xpore_diffmod.nf @@ -15,7 +15,7 @@ process XPORE_DIFFMOD { diffmod_config = "--config $workflow.workDir/*/*/diffmod_config.yml" """ create_yml.py diffmod_config.yml $dataprep_dirs - xpore diffmod $diffmod_config --n_processes $params.max_cpus + xpore diffmod $diffmod_config --n_processes $task.cpus cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index e4ec4bf1..d61efb99 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -7,9 +7,10 @@ include { SAMPLESHEET_CHECK } from '../../modules/local/samplesheet_check' workflow INPUT_CHECK { take: samplesheet // file: /path/to/samplesheet.csv + input_path main: - SAMPLESHEET_CHECK ( samplesheet ) + SAMPLESHEET_CHECK ( samplesheet, input_path ) .csv .splitCsv ( header:true, sep:',' ) .map { get_sample_info(it, params.genomes) } diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 7d938351..33c53992 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -144,10 +144,34 @@ def multiqc_report = [] workflow NANOSEQ{ + // Pre-download test-dataset to get files for '--input_path' parameter + // Nextflow is unable to recursively download directories via HTTPS + if (workflow.profile.contains('test') && !workflow.profile.contains('vc')){ + if (!params.skip_basecalling || !params.skip_modification_analysis) { + if (!isOffline()) { + GET_TEST_DATA ().set { ch_input_path } + } else { + exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download and run any test dataset!" + } + } else { + if (params.input_path) { + ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) + } else { + ch_input_path = 'not_changed' + } + } + } else { + if (params.input_path) { + ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) + } else { + ch_input_path = 'not_changed' + } + } + /* * SUBWORKFLOW: Read in samplesheet, validate and stage input files */ - INPUT_CHECK ( ch_input ) + INPUT_CHECK ( ch_input, ch_input_path ) .set { ch_sample } ch_software_versions = Channel.empty() @@ -157,19 +181,6 @@ workflow NANOSEQ{ .map { it[0] } .set { ch_sample_name } - // Pre-download test-dataset to get files for '--input_path' parameter - // Nextflow is unable to recursively download directories via HTTPS - if (workflow.profile.contains('test')) { - if (!isOffline()) { - GET_TEST_DATA ().set { ch_input_path } - } else { - exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download and run any test dataset!" - } - } else { - if (params.input_path) { - ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) - } - } /* * MODULE: Basecalling and demultipexing using Guppy */ From 3ed44ef51d8c0b890b60e5b6ebb6100406211d17 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Tue, 28 Dec 2021 13:52:07 +0800 Subject: [PATCH 045/169] add GitHub action --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f7ad3b29..e0875eb4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: NXF_ANSI_LOG: false strategy: matrix: - profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx_vc, test_nobc_nodx, test_nobc_nodx_noaln] + profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx_vc, test_nobc_nodx, test_nobc_nodx_noaln, test_nobc_nodx_rnamod] steps: - name: Check out pipeline code uses: actions/checkout@v2 From 42211205efd4f47df9ec13e49a95723009606247 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Tue, 28 Dec 2021 13:58:08 +0800 Subject: [PATCH 046/169] 2CPUs for GitHub Actions --- conf/test_nobc_nodx_rnamod.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_rnamod.config b/conf/test_nobc_nodx_rnamod.config index 93a0322f..86284506 100644 --- a/conf/test_nobc_nodx_rnamod.config +++ b/conf/test_nobc_nodx_rnamod.config @@ -12,7 +12,7 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Limit resources so that this can run on Travis - max_cpus = 8 + max_cpus = 2 max_memory = 6.GB max_time = 12.h From f4b01d95b9ab662f0d5c0f03600b10075e7960c5 Mon Sep 17 00:00:00 2001 From: Venkat Malladi Date: Thu, 30 Dec 2021 15:21:25 -0600 Subject: [PATCH 047/169] Add search path for all files. --- modules/local/get_test_data.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/get_test_data.nf b/modules/local/get_test_data.nf index a0b8f606..1ebb9b57 100644 --- a/modules/local/get_test_data.nf +++ b/modules/local/get_test_data.nf @@ -1,8 +1,8 @@ process GET_TEST_DATA { container "docker.io/yuukiiwa/git:latest" - output: - path "test-datasets/fast5/$barcoded" , emit: ch_input_path + output: + path "test-datasets/fast5/$barcoded/*" , emit: ch_input_path script: barcoded = workflow.profile.contains('test_bc_nodx') ? "nonbarcoded" : "barcoded" From 8e08c728599c2487596ce857bb9e110a0d7553d9 Mon Sep 17 00:00:00 2001 From: Venkat Malladi Date: Thu, 30 Dec 2021 16:47:29 -0600 Subject: [PATCH 048/169] Add bug fix to change log. --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e642ae5e..c881ae13 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `multiqc` | 1.10.1 | 1.11 | | `sniffles` | | 1.0.12 | +### Bug fix + +* The `GET_TEST_DATA` process now uses checks for any file in the path. + > **NB:** Dependency has been __updated__ if both old and new version information is present. > **NB:** Dependency has been __added__ if just the new version information is present. > **NB:** Dependency has been __removed__ if version information isn't present. From efab36bf144335a3ee2aa0e85e4b8f191907b106 Mon Sep 17 00:00:00 2001 From: Venkat Malladi Date: Mon, 3 Jan 2022 10:08:47 -0600 Subject: [PATCH 049/169] Fix path. --- modules/local/get_test_data.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/get_test_data.nf b/modules/local/get_test_data.nf index 1ebb9b57..90ccb93f 100644 --- a/modules/local/get_test_data.nf +++ b/modules/local/get_test_data.nf @@ -2,7 +2,7 @@ process GET_TEST_DATA { container "docker.io/yuukiiwa/git:latest" output: - path "test-datasets/fast5/$barcoded/*" , emit: ch_input_path + path "test-datasets/fast5/$barcoded/" , emit: ch_input_path script: barcoded = workflow.profile.contains('test_bc_nodx') ? "nonbarcoded" : "barcoded" From d7968965fc5fe1db3021c16b9b68fb88143ff20e Mon Sep 17 00:00:00 2001 From: Venkat Malladi Date: Tue, 4 Jan 2022 09:52:54 -0600 Subject: [PATCH 050/169] Make changes to path to meet azure requirements. --- modules/local/get_test_data.nf | 2 +- modules/local/guppy.nf | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/local/get_test_data.nf b/modules/local/get_test_data.nf index 90ccb93f..1ebb9b57 100644 --- a/modules/local/get_test_data.nf +++ b/modules/local/get_test_data.nf @@ -2,7 +2,7 @@ process GET_TEST_DATA { container "docker.io/yuukiiwa/git:latest" output: - path "test-datasets/fast5/$barcoded/" , emit: ch_input_path + path "test-datasets/fast5/$barcoded/*" , emit: ch_input_path script: barcoded = workflow.profile.contains('test_bc_nodx') ? "nonbarcoded" : "barcoded" diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index 4d839923..d7041af6 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -9,7 +9,7 @@ process GUPPY { } input: - path(input_path) + path(input_path), stageAs: 'input_path/*' val meta path guppy_config path guppy_model @@ -30,7 +30,7 @@ process GUPPY { if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" """ guppy_basecaller \\ - --input_path $input_path \\ + --input_path input_path \\ --save_path ./basecalling \\ --records_per_fastq 0 \\ --compress_fastq \\ From e4fe8866a40eb3c4bf8041d847d4d15d55a64e9f Mon Sep 17 00:00:00 2001 From: Venkat Malladi Date: Tue, 4 Jan 2022 10:20:35 -0600 Subject: [PATCH 051/169] Update schema to be file list instead of just directory. --- nextflow_schema.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 60dce87b..806e123e 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -63,8 +63,9 @@ "properties": { "input_path": { "type": "string", - "description": "Path to Nanopore run directory (e.g. 'fastq_pass/') or a basecalled fastq file that requires demultiplexing. The latter can only be provided in conjunction with the '--skip_basecalling' parameter.", - "fa_icon": "fas fa-folder-open" + "format": "file-path", + "description": "Path to Nanopore run directory files (e.g. 'fastq_pass/*') or a basecalled fastq file that requires demultiplexing. The latter can only be provided in conjunction with the '--skip_basecalling' parameter.", + "fa_icon": "far fa-file-code" }, "flowcell": { "type": "string", From c588818bc4c7645c8926e54fc23379d687b3b07e Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Mon, 10 Jan 2022 15:58:20 +0100 Subject: [PATCH 052/169] Fix version information for new modules --- modules/local/cutesv.nf | 35 +++++++++++++++++++++++ modules/local/sniffles.nf | 2 +- subworkflows/local/dna_variant_calling.nf | 15 ++++++++-- workflows/nanoseq.nf | 4 +-- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 modules/local/cutesv.nf diff --git a/modules/local/cutesv.nf b/modules/local/cutesv.nf new file mode 100644 index 00000000..b4fed374 --- /dev/null +++ b/modules/local/cutesv.nf @@ -0,0 +1,35 @@ +process CUTESV { + tag "$meta.id" + label 'process_high' + + conda (params.enable_conda ? "bioconda::cutesv=1.0.12" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/cutesv:1.0.12--pyhdfd78af_0' : + 'quay.io/biocontainers/cutesv:1.0.12--pyhdfd78af_0' }" + + input: + tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) + path(fasta) + + output: + path "*_cuteSV.vcf" , emit: sv_calls // vcf files + path "versions.yml" , emit: versions + + script: + """ + cuteSV \ + ${bam} \ + ${fasta} \ + ${meta.id}_cuteSV.vcf \ + . \ + --threads $task.cpus \ + --sample ${meta.id} \ + --genotype + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + cuteSV: \$( cuteSV --version 2>&1 | sed 's/cuteSV //g' ) + END_VERSIONS + """ +} + diff --git a/modules/local/sniffles.nf b/modules/local/sniffles.nf index a54addeb..d1c887f8 100644 --- a/modules/local/sniffles.nf +++ b/modules/local/sniffles.nf @@ -25,7 +25,7 @@ process SNIFFLES { cat <<-END_VERSIONS > versions.yml "${task.process}": - sniffles: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") //need sniffles's version + sniffles: \$(sniffles --help 2>&1 | grep Version |sed 's/^.*Version: //') END_VERSIONS """ } diff --git a/subworkflows/local/dna_variant_calling.nf b/subworkflows/local/dna_variant_calling.nf index 27d1ffd1..66901d53 100644 --- a/subworkflows/local/dna_variant_calling.nf +++ b/subworkflows/local/dna_variant_calling.nf @@ -4,6 +4,7 @@ include { MEDAKA_VARIANT } from '../../modules/local/medaka_variant' include { SNIFFLES } from '../../modules/local/sniffles' +//include { CUTESV } from '../../modules/local/cutesv' workflow DNA_VARIANT_CALLING { @@ -16,6 +17,7 @@ workflow DNA_VARIANT_CALLING { main: ch_variant_calls = Channel.empty() + medaka_version = Channel.empty() if (!skip_medaka){ /* * Split into a different channel for each chromosome @@ -33,22 +35,31 @@ workflow DNA_VARIANT_CALLING { //}.set{ch_bam_vc_chrom} /* - * Call variants with MEDAKA + * Call short variants */ MEDAKA_VARIANT( ch_view_sortbam, ch_index ) ch_variant_calls = MEDAKA_VARIANT.out.variant_calls + medaka_version = MEDAKA_VARIANT.out.versions } ch_sv_calls = Channel.empty() + sniffles_version = Channel.empty() if (!skip_sniffles){ /* - * Call variants with SNIFFLES + * Call structural variants */ SNIFFLES( ch_view_sortbam ) ch_sv_calls = SNIFFLES.out.sv_calls + sniffles_version = SNIFFLES.out.versions + } else{ } emit: ch_variant_calls + medaka_version ch_sv_calls + sniffles_version + + + } diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index fd42720b..0b29e6b4 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -307,9 +307,9 @@ workflow NANOSEQ{ /* * SUBWORKFLOW: DNA variant calling */ - ch_medaka_version = Channel.empty() - ch_sniffles_version = Channel.empty() DNA_VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] }, params.skip_medaka, params.skip_sniffles ) + ch_software_versions = ch_software_versions.mix(DNA_VARIANT_CALLING.out.sniffles_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(DNA_VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) } ch_bedtools_version = Channel.empty() From 6e698deac6790f9a7192851568be6f5bb6f69c49 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Mon, 10 Jan 2022 16:03:58 +0100 Subject: [PATCH 053/169] Fix linting --- modules/local/cutesv.nf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/local/cutesv.nf b/modules/local/cutesv.nf index b4fed374..de169910 100644 --- a/modules/local/cutesv.nf +++ b/modules/local/cutesv.nf @@ -19,12 +19,12 @@ process CUTESV { """ cuteSV \ ${bam} \ - ${fasta} \ + ${fasta} \ ${meta.id}_cuteSV.vcf \ . \ --threads $task.cpus \ --sample ${meta.id} \ - --genotype + --genotype cat <<-END_VERSIONS > versions.yml "${task.process}": From 007955af14a480baaee32a023b32bb9895f0e2f6 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Wed, 19 Jan 2022 19:31:11 +0800 Subject: [PATCH 054/169] make test_nobc_nodx compatible with Azure changes --- modules/local/get_test_data.nf | 6 +++--- workflows/nanoseq.nf | 9 ++++++++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/modules/local/get_test_data.nf b/modules/local/get_test_data.nf index c8e47d61..326aacfc 100644 --- a/modules/local/get_test_data.nf +++ b/modules/local/get_test_data.nf @@ -2,11 +2,11 @@ process GET_TEST_DATA { container "docker.io/yuukiiwa/git:latest" output: - path "test-datasets/fast5/$barcoded/*" , emit: ch_input_path + path "test-datasets/fast5/$barcoded/*" , emit: ch_input_fast5s_path + path "test-datasets/modification_fast5_fastq/$barcoded/" , emit: ch_input_dir_path script: - subdir = workflow.profile.contains('test_nobc_nodx_rnamod') ? "modification_fast5_fastq" : "fast5" - barcoded = (workflow.profile.contains('test_bc_nodx') || workflow.profile.contains('test_nobc_nodx_rnamod')) ? "nonbarcoded" : "barcoded" + barcoded = (workflow.profile.contains('test_bc_nodx') || workflow.profile.contains('rnamod')) ? "nonbarcoded" : "barcoded" """ git clone https://github.com/nf-core/test-datasets.git --branch nanoseq --single-branch """ diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 33c53992..2d17ba9a 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -149,7 +149,14 @@ workflow NANOSEQ{ if (workflow.profile.contains('test') && !workflow.profile.contains('vc')){ if (!params.skip_basecalling || !params.skip_modification_analysis) { if (!isOffline()) { - GET_TEST_DATA ().set { ch_input_path } + GET_TEST_DATA () + if (params.skip_modification_analysis){ + GET_TEST_DATA.out.ch_input_fast5s_path + .set { ch_input_path } + } else { + GET_TEST_DATA.out.ch_input_dir_path + .set { ch_input_path } + } } else { exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download and run any test dataset!" } From 2f5e20c5cceb85bf6aae7f615bd705fdcb0cb1f8 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Wed, 19 Jan 2022 20:42:31 +0800 Subject: [PATCH 055/169] update based on restructured test-dataset --- modules/local/get_test_data.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/get_test_data.nf b/modules/local/get_test_data.nf index 326aacfc..4cab80cd 100644 --- a/modules/local/get_test_data.nf +++ b/modules/local/get_test_data.nf @@ -3,7 +3,7 @@ process GET_TEST_DATA { output: path "test-datasets/fast5/$barcoded/*" , emit: ch_input_fast5s_path - path "test-datasets/modification_fast5_fastq/$barcoded/" , emit: ch_input_dir_path + path "test-datasets/modification_fast5_fastq/" , emit: ch_input_dir_path script: barcoded = (workflow.profile.contains('test_bc_nodx') || workflow.profile.contains('rnamod')) ? "nonbarcoded" : "barcoded" From 7bff4cee8b1ac1e9e9dd2c723c02e22befbebed4 Mon Sep 17 00:00:00 2001 From: ekushele Date: Thu, 20 Jan 2022 13:28:20 +0200 Subject: [PATCH 056/169] pipeline works, but doesn't save basecalling guppy directory. not sure true input for demux_fast5 --- conf/modules.config | 20 ++- modules/local/demux_fast5.nf | 40 ++++++ modules/local/guppy.nf | 124 ++++++++++-------- nextflow.config | 3 + nextflow_schema.json | 15 +++ .../local/guppy_basecall_demultiplex.nf | 60 +++++++++ workflows/nanoseq.nf | 41 +++--- 7 files changed, 225 insertions(+), 78 deletions(-) create mode 100755 modules/local/demux_fast5.nf create mode 100644 subworkflows/local/guppy_basecall_demultiplex.nf diff --git a/conf/modules.config b/conf/modules.config index 4bfd2566..77f0f53e 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -19,13 +19,29 @@ params { modules { 'get_test_data'{ - publish_dir = 'test-datasets' + publish_dir = 'test-datasets' } 'check_samplesheet' { publish_dir = 'public_data' } 'guppy' { - publish_dir = 'guppy' + publish_dir = 'guppy' + publish_files = ['.fastq.gz':'fastq','versions.yml':'.','basecalling':'check_base'] + // publish_dir = [ + // [ + // path: 'guppy', + // pattern: "{basecalling,fastq,versions.yml}" + // ], + // [ + // path: 'guppy', + // pattern: "workspace", + // enabled: params.output_fast5 && params.skip_demultiplexing_fast5 + // ] + + // ] + } + 'demux_fast5' { + publish_dir = 'demux_fast5' } 'qcat' { publish_dir = 'qcat' diff --git a/modules/local/demux_fast5.nf b/modules/local/demux_fast5.nf new file mode 100755 index 00000000..d4ecc1bf --- /dev/null +++ b/modules/local/demux_fast5.nf @@ -0,0 +1,40 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +def options = initOptions(params.options) + +process DEMUX_FAST5 { + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process)) } + + + conda (params.enable_conda ? "bioconda:ont-fast5-api:4.0.0--pyhdfd78af_0" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/ont-fast5-api:4.0.0--pyhdfd78af_0" + } else { + container "quay.io/biocontainers/ont-fast5-api:4.0.0--pyhdfd78af_0" + } + + input: + path(input_fast5_path) + tuple val(meta), path(input_summary) + + output: + path "demultiplexed_fast5/*" , emit: fast5 + path "versions.yml" , emit: versions + + script: + """ + demux_fast5 \\ + --input $input_fast5_path \\ + --save_path ./demultiplexed_fast5 \\ + --summary_file $input_summary + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(python -c\'import ont_fast5_api;print(ont_fast5_api.__version__)\')) + END_VERSIONS + """ +} diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index 04608dd3..234f07be 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -5,67 +5,77 @@ params.options = [:] def options = initOptions(params.options) process GUPPY { - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process)) } + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process)) } - if (params.guppy_gpu) { - container = 'genomicpariscentre/guppy-gpu:4.0.14' - clusterOptions = params.gpu_cluster_options - } else { - container = 'genomicpariscentre/guppy:4.0.14' - } + if (params.guppy_gpu) { + container = 'genomicpariscentre/guppy-gpu:5.0.16' + clusterOptions = params.gpu_cluster_options + } else { + container = 'genomicpariscentre/guppy:5.0.16' + } - input: - path(input_path) - val meta - path guppy_config - path guppy_model + input: + path(input_path) + val meta + path guppy_config + path guppy_model - output: - path "fastq/*.fastq.gz" , emit: fastq - tuple val(meta), path("basecalling/*.txt") , emit: summary - path "basecalling/*" , emit: called - path "versions.yml" , emit: versions + output: + path "fastq/*.fastq.gz" , emit: fastq + tuple val(meta), path("basecalling/*.txt") , emit: summary + path "basecalling/*" , emit: called + path "workspace" , optional:true, emit: fast5, type: 'dir' + path "versions.yml" , emit: versions - script: - def barcode_kit = params.barcode_kit ? "--barcode_kits $params.barcode_kit" : "" - def barcode_ends = params.barcode_both_ends ? "--require_barcodes_both_ends" : "" - def proc_options = params.guppy_gpu ? "--device $params.gpu_device --num_callers $task.cpus --cpu_threads_per_caller $params.guppy_cpu_threads --gpu_runners_per_device $params.guppy_gpu_runners" : "--num_callers 2 --cpu_threads_per_caller ${task.cpus/2}" - def config = "--flowcell $params.flowcell --kit $params.kit" - if (params.guppy_config) config = file(params.guppy_config).exists() ? "--config ./$guppy_config" : "--config $params.guppy_config" - def model = "" - if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" - """ - guppy_basecaller \\ - --input_path $input_path \\ - --save_path ./basecalling \\ - --records_per_fastq 0 \\ - --compress_fastq \\ - $barcode_kit \\ - $proc_options \\ - $barcode_ends \\ - $config \\ - $model + script: + def trim_barcodes = params.trim_barcodes ? "--trim_barcodes" : "" + def barcode_kit = params.barcode_kit ? "--barcode_kits $params.barcode_kit" : "" + def barcode_ends = params.barcode_both_ends ? "--require_barcodes_both_ends" : "" + def proc_options = params.guppy_gpu ? "--device $params.gpu_device --num_callers $task.cpus --cpu_threads_per_caller $params.guppy_cpu_threads --gpu_runners_per_device $params.guppy_gpu_runners" : "--num_callers 2 --cpu_threads_per_caller ${task.cpus/2}" + def config = "--flowcell $params.flowcell --kit $params.kit" + if (params.guppy_config) config = file(params.guppy_config).exists() ? "--config ./$guppy_config" : "--config $params.guppy_config" + def model = "" + if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" + def fast5_out = params.output_fast5 ? "--fast5_out " : "" + """ + guppy_basecaller \\ + --input_path $input_path \\ + --save_path ./basecalling \\ + --records_per_fastq 0 \\ + --compress_fastq \\ + $barcode_kit \\ + $proc_options \\ + $barcode_ends \\ + $config \\ + $trim_barcodes \\ + $fast5_out \\ + $model - cat <<-END_VERSIONS > versions.yml - ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') - END_VERSIONS + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') + END_VERSIONS - ## Concatenate fastq files - mkdir fastq - cd basecalling - if [ "\$(find . -type d -name "barcode*" )" != "" ] - then - for dir in barcode*/ - do - dir=\${dir%*/} - cat \$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz - done - else - cat *.fastq.gz > ../fastq/${meta.id}.fastq.gz - fi - """ + ## Concatenate fastq files + mkdir fastq + cd basecalling + if [ "\$(find . -type d -name "barcode*" )" != "" ] + then + for dir in pass/barcode*/ + do + dir=\$(basename \${dir%*/}) + cat pass/\$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz + done + else + cat *.fastq.gz > ../fastq/${meta.id}.fastq.gz + fi + ##remove workspace from basecalling direcoties + if [ "\$(find . -type d -name "workspace" )" != "" ] + then + mv workspace ../ + fi + """ } diff --git a/nextflow.config b/nextflow.config index 76de0fdc..2293f381 100644 --- a/nextflow.config +++ b/nextflow.config @@ -19,6 +19,8 @@ params { kit = null barcode_kit = null barcode_both_ends = false + trim_barcodes = false + output_fast5 = false guppy_config = null guppy_model = null guppy_gpu = false @@ -30,6 +32,7 @@ params { qcat_detect_middle = false skip_basecalling = false skip_demultiplexing = false + skip_demultiplexing_fast5 = false // Options: Raw read cleaning nanolyse_fasta = null diff --git a/nextflow_schema.json b/nextflow_schema.json index 4d046201..b31f74da 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -87,6 +87,16 @@ "fa_icon": "fas fa-barcode", "description": "Require barcode on both ends for Guppy basecaller." }, + "trim_barcodes": { + "type": "boolean", + "fa_icon": "fas fa-barcode", + "description": "Wether to trim the barcodes from the output sequences in the FastQ files from Guppy basecaller." + }, + "output_fast5": { + "type": "boolean", + "fa_icon": "fas fa-folder-open", + "description": "Output fast5 files. if `--skip_demultiplexing_fast5` is set, output fast5 files will be saved as is." + }, "guppy_config": { "type": "string", "help_text": "Cannot be used in conjunction with `--flowcell` and `--kit`. This can be a local file (e.g. `/your/dir/guppy_conf.cfg`) or a string specifying a configuration stored in the `/opt/ont/guppy/data/` directory of Guppy.", @@ -147,6 +157,11 @@ "type": "boolean", "description": "Skip demultiplexing with Guppy/qcat.", "fa_icon": "fas fa-fast-forward" + }, + "skip_demultiplexing_fast5": { + "type": "boolean", + "description": "Skip demultiplexing of fast5 files with Guppy/demux_fast5.", + "fa_icon": "fas fa-fast-forward" }, "run_nanolyse": { "type": "boolean", diff --git a/subworkflows/local/guppy_basecall_demultiplex.nf b/subworkflows/local/guppy_basecall_demultiplex.nf new file mode 100644 index 00000000..205d563a --- /dev/null +++ b/subworkflows/local/guppy_basecall_demultiplex.nf @@ -0,0 +1,60 @@ +/* + * Basecalling and demultiplexing fast5 using Guppy and ont_fast5_api + */ + +params.guppy_options = [:] +params.demux_fast5_options = [:] + +include { GUPPY } from '../../modules/local/guppy' addParams( options: params.guppy_options ) +include { DEMUX_FAST5 } from '../../modules/local/demux_fast5' addParams( options: params.demux_fast5_options ) + +workflow GUPPY_BASECALL_DEMULTIPLEX { + take: + ch_input_path + ch_sample_name + ch_guppy_config + ch_guppy_model + ch_sample + + main: + /* + * Basecalling with guppy + */ + GUPPY ( ch_input_path, ch_sample_name, ch_guppy_config.ifEmpty([]), ch_guppy_model.ifEmpty([]) ) + ch_guppy_summary = GUPPY.out.summary + guppy_version = GUPPY.out.versions + + if (params.skip_demultiplexing){ + ch_sample + .map { it -> [ it[0], it[0].id, it[2], it[3], it[4], it[5] ] } + .set { ch_sample } + } + + GUPPY.out.fastq + .flatten() + .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.')) ] } + .join(ch_sample, by: 1) // join on barcode + .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } + .set { ch_fastq } + + GUPPY.out.summary.view() + demultiplexed_fast5 = GUPPY.out.fast5 + input_summary = GUPPY.out.summary + /* + * Demultiplex fast5 files + */ + if (params.output_fast5 && !params.skip_demultiplexing_fast5) { + DEMUX_FAST5 ( demultiplexed_fast5, input_summary ) + } + + dumex_fast5_version = DEMUX_FAST5.out.versions + demultiplexed_fast5 = DEMUX_FAST5.out.fast5 + + emit: + guppy_version + ch_guppy_summary + ch_fastq + //demultiplexed_fast5 + dumex_fast5_version + +} diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index f6c94fc7..c82536fe 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -101,14 +101,12 @@ def multiqc_options = modules['multiqc'] multiqc_options.args += params.multiqc_title ? " --title \"$params.multiqc_title\"" : '' if (params.skip_alignment) { multiqc_options['publish_dir'] = '' } -def guppy_options = modules['guppy'] def qcat_options = modules['qcat'] def nanolyse_options = modules['nanolyse'] def bambu_options = modules['bambu'] include { GET_TEST_DATA } from '../modules/local/get_test_data' addParams( options: [:] ) include { GET_NANOLYSE_FASTA } from '../modules/local/get_nanolyse_fasta' addParams( options: [:] ) -include { GUPPY } from '../modules/local/guppy' addParams( options: guppy_options ) include { QCAT } from '../modules/local/qcat' addParams( options: qcat_options ) include { BAM_RENAME } from '../modules/local/bam_rename' addParams( options: [:] ) include { BAMBU } from '../modules/local/bambu' addParams( options: bambu_options ) @@ -118,6 +116,8 @@ include { MULTIQC } from '../modules/local/multiqc' /* * SUBWORKFLOW: Consisting of a mix of local and nf-core/modules */ +def guppy_options = modules['guppy'] +def demux_fast5_options = modules['demux_fast5'] def pycoqc_options = modules['pycoqc'] def nanoplot_options = modules['nanoplot'] def fastqc_options = modules['fastqc'] @@ -135,6 +135,7 @@ def deseq2_options = modules['deseq2'] def dexseq_options = modules['dexseq'] include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) +include { GUPPY_BASECALL_DEMULTIPLEX } from '../subworkflows/local/guppy_basecall_demultiplex' addParams( guppy_options: guppy_options, demux_fast5_options: demux_fast5_options ) include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( genome_options: genome_options ) include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options, samtools_options: samtools_sort_options ) include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options, samtools_options: samtools_sort_options ) @@ -195,24 +196,26 @@ workflow NANOSEQ{ } } /* - * MODULE: Basecalling and demultipexing using Guppy + * SUBWORKFLOW: Basecalling and demultiplexing fast5 using Guppy and ont_fast5_api */ - GUPPY ( ch_input_path, ch_sample_name, ch_guppy_config.ifEmpty([]), ch_guppy_model.ifEmpty([]) ) - ch_guppy_summary = GUPPY.out.summary - ch_software_versions = ch_software_versions.mix(GUPPY.out.versions.ifEmpty(null)) - - if (params.skip_demultiplexing){ - ch_sample - .map { it -> [ it[0], it[0].id, it[2], it[3], it[4], it[5] ] } - .set { ch_sample } - } - - GUPPY.out.fastq - .flatten() - .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.')) ] } - .join(ch_sample, by: 1) // join on barcode - .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } - .set { ch_fastq } + GUPPY_BASECALL_DEMULTIPLEX ( ch_input_path, ch_sample_name, ch_guppy_config.ifEmpty([]), ch_guppy_model.ifEmpty([]), ch_sample ) + ch_guppy_summary = GUPPY_BASECALL_DEMULTIPLEX.out.ch_guppy_summary + ch_software_versions = ch_software_versions.mix(GUPPY_BASECALL_DEMULTIPLEX.out.guppy_version.first().ifEmpty(null)) + ch_fastq = GUPPY_BASECALL_DEMULTIPLEX.out.ch_fastq + + ch_software_versions = ch_software_versions.mix(GUPPY_BASECALL_DEMULTIPLEX.out.dumex_fast5_version.ifEmpty(null)) + // if (params.skip_demultiplexing){ + // ch_sample + // .map { it -> [ it[0], it[0].id, it[2], it[3], it[4], it[5] ] } + // .set { ch_sample } + // } + + // GUPPY.out.fastq + // .flatten() + // .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.')) ] } + // .join(ch_sample, by: 1) // join on barcode + // .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } + // .set { ch_fastq } } else { ch_guppy_summary = Channel.empty() From 649f7fa1f7d254acbea5c33673ddfc92d6a19b9e Mon Sep 17 00:00:00 2001 From: ekushele Date: Thu, 20 Jan 2022 19:19:11 +0200 Subject: [PATCH 057/169] demultiplex on original files --- conf/modules.config | 13 - docs/output.md | 8 +- modules/local/demux_fast5.nf | 3 +- modules/local/guppy.nf | 10 +- nextflow.config | 3 +- nextflow_schema.json | 16 +- .../local/guppy_basecall_demultiplex.nf | 60 -- workflows/nanoseq.nf | 662 +++++++++--------- 8 files changed, 353 insertions(+), 422 deletions(-) delete mode 100644 subworkflows/local/guppy_basecall_demultiplex.nf diff --git a/conf/modules.config b/conf/modules.config index 77f0f53e..e1661c63 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -26,19 +26,6 @@ params { } 'guppy' { publish_dir = 'guppy' - publish_files = ['.fastq.gz':'fastq','versions.yml':'.','basecalling':'check_base'] - // publish_dir = [ - // [ - // path: 'guppy', - // pattern: "{basecalling,fastq,versions.yml}" - // ], - // [ - // path: 'guppy', - // pattern: "workspace", - // enabled: params.output_fast5 && params.skip_demultiplexing_fast5 - // ] - - // ] } 'demux_fast5' { publish_dir = 'demux_fast5' diff --git a/docs/output.md b/docs/output.md index 6a367f8d..7d2ee530 100644 --- a/docs/output.md +++ b/docs/output.md @@ -31,6 +31,10 @@ The directories listed below will be created in the output directory after the p Sequencing telemetry file generated by *Guppy*. * `guppy/basecalling/guppy_basecaller_log-.log` Log file for *Guppy* execution. +* `demux_fast5/demultiplexed_fast5//` + fast5 output files for each barcode. +* `demux_fast5/demultiplexed_fast5/unclassified/` + fast5 files with reads were unassigned to any given barcode. * `qcat/fastq/.fastq.gz` fastq output files for each barcode. * `qcat/fastq/none.fastq.gz` @@ -39,13 +43,15 @@ The directories listed below will be created in the output directory after the p
*Documentation*: -[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [qcat](https://github.com/nanoporetech/qcat) +[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux_fasat5](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) *Description*: The pipeline has been written to deal with the various scenarios where you would like to include/exclude the basecalling and demultiplexing steps. This will be dependent on what type of input data you would like to provide the pipeline. Additionally, if you would like to align your samples to a reference genome there are various options for providing this information. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet, associated commands and how to provide reference genome data. *Guppy* will be used to basecall and demultiplex the data. Various options have been provided to customise specific parameters and to be able to run *Guppy* on GPUs. +*demux_fasat5* will demultiplex the fast5 files, gives the *Guppy* summary file. + If you have a pre-basecalled fastq file then *qcat* will be used to perform the demultiplexing if you provide the `--skip_basecalling` parameter. If you would like to skip both of these steps entirely then you can provide `--skip_basecalling --skip_demultiplexing` when running the pipeline. As a result, the structure of the output folder will depend on which steps you have chosen to run in the pipeline. ## Removal of DNA contaminants diff --git a/modules/local/demux_fast5.nf b/modules/local/demux_fast5.nf index d4ecc1bf..1db32ae1 100755 --- a/modules/local/demux_fast5.nf +++ b/modules/local/demux_fast5.nf @@ -32,9 +32,10 @@ process DEMUX_FAST5 { --input $input_fast5_path \\ --save_path ./demultiplexed_fast5 \\ --summary_file $input_summary + cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(python -c\'import ont_fast5_api;print(ont_fast5_api.__version__)\')) + ${getSoftwareName(task.process)}: \$(echo \$(python -c\'import ont_fast5_api;print(ont_fast5_api.__version__)\')) END_VERSIONS """ } diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index 234f07be..880fced1 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -27,7 +27,6 @@ process GUPPY { path "fastq/*.fastq.gz" , emit: fastq tuple val(meta), path("basecalling/*.txt") , emit: summary path "basecalling/*" , emit: called - path "workspace" , optional:true, emit: fast5, type: 'dir' path "versions.yml" , emit: versions script: @@ -39,7 +38,6 @@ process GUPPY { if (params.guppy_config) config = file(params.guppy_config).exists() ? "--config ./$guppy_config" : "--config $params.guppy_config" def model = "" if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" - def fast5_out = params.output_fast5 ? "--fast5_out " : "" """ guppy_basecaller \\ --input_path $input_path \\ @@ -51,12 +49,11 @@ process GUPPY { $barcode_ends \\ $config \\ $trim_barcodes \\ - $fast5_out \\ $model cat <<-END_VERSIONS > versions.yml ${getProcessName(task.process)}: - ${getSoftwareName(task.process)}: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') + ${getSoftwareName(task.process)}: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') END_VERSIONS ## Concatenate fastq files @@ -72,10 +69,5 @@ process GUPPY { else cat *.fastq.gz > ../fastq/${meta.id}.fastq.gz fi - ##remove workspace from basecalling direcoties - if [ "\$(find . -type d -name "workspace" )" != "" ] - then - mv workspace ../ - fi """ } diff --git a/nextflow.config b/nextflow.config index 2293f381..ec78e729 100644 --- a/nextflow.config +++ b/nextflow.config @@ -20,7 +20,6 @@ params { barcode_kit = null barcode_both_ends = false trim_barcodes = false - output_fast5 = false guppy_config = null guppy_model = null guppy_gpu = false @@ -28,11 +27,11 @@ params { guppy_cpu_threads = 1 gpu_device = 'auto' gpu_cluster_options = null + output_demultiplex_fast5 = false qcat_min_score = 60 qcat_detect_middle = false skip_basecalling = false skip_demultiplexing = false - skip_demultiplexing_fast5 = false // Options: Raw read cleaning nanolyse_fasta = null diff --git a/nextflow_schema.json b/nextflow_schema.json index b31f74da..e8272fb0 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -92,11 +92,6 @@ "fa_icon": "fas fa-barcode", "description": "Wether to trim the barcodes from the output sequences in the FastQ files from Guppy basecaller." }, - "output_fast5": { - "type": "boolean", - "fa_icon": "fas fa-folder-open", - "description": "Output fast5 files. if `--skip_demultiplexing_fast5` is set, output fast5 files will be saved as is." - }, "guppy_config": { "type": "string", "help_text": "Cannot be used in conjunction with `--flowcell` and `--kit`. This can be a local file (e.g. `/your/dir/guppy_conf.cfg`) or a string specifying a configuration stored in the `/opt/ont/guppy/data/` directory of Guppy.", @@ -136,6 +131,11 @@ "type": "string", "description": "Cluster options required to use GPU resources (e.g. '--part=gpu --gres=gpu:1').", "fa_icon": "fas fa-fish" + }, + "output_demultiplex_fast5": { + "type": "boolean", + "description": "Output emultiplex fast5 files with demux_fast5.", + "fa_icon": "fas fa-file-code" }, "qcat_min_score": { "type": "integer", @@ -158,11 +158,7 @@ "description": "Skip demultiplexing with Guppy/qcat.", "fa_icon": "fas fa-fast-forward" }, - "skip_demultiplexing_fast5": { - "type": "boolean", - "description": "Skip demultiplexing of fast5 files with Guppy/demux_fast5.", - "fa_icon": "fas fa-fast-forward" - }, + "run_nanolyse": { "type": "boolean", "description": "Filter reads from FastQ files using NanoLyse", diff --git a/subworkflows/local/guppy_basecall_demultiplex.nf b/subworkflows/local/guppy_basecall_demultiplex.nf deleted file mode 100644 index 205d563a..00000000 --- a/subworkflows/local/guppy_basecall_demultiplex.nf +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Basecalling and demultiplexing fast5 using Guppy and ont_fast5_api - */ - -params.guppy_options = [:] -params.demux_fast5_options = [:] - -include { GUPPY } from '../../modules/local/guppy' addParams( options: params.guppy_options ) -include { DEMUX_FAST5 } from '../../modules/local/demux_fast5' addParams( options: params.demux_fast5_options ) - -workflow GUPPY_BASECALL_DEMULTIPLEX { - take: - ch_input_path - ch_sample_name - ch_guppy_config - ch_guppy_model - ch_sample - - main: - /* - * Basecalling with guppy - */ - GUPPY ( ch_input_path, ch_sample_name, ch_guppy_config.ifEmpty([]), ch_guppy_model.ifEmpty([]) ) - ch_guppy_summary = GUPPY.out.summary - guppy_version = GUPPY.out.versions - - if (params.skip_demultiplexing){ - ch_sample - .map { it -> [ it[0], it[0].id, it[2], it[3], it[4], it[5] ] } - .set { ch_sample } - } - - GUPPY.out.fastq - .flatten() - .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.')) ] } - .join(ch_sample, by: 1) // join on barcode - .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } - .set { ch_fastq } - - GUPPY.out.summary.view() - demultiplexed_fast5 = GUPPY.out.fast5 - input_summary = GUPPY.out.summary - /* - * Demultiplex fast5 files - */ - if (params.output_fast5 && !params.skip_demultiplexing_fast5) { - DEMUX_FAST5 ( demultiplexed_fast5, input_summary ) - } - - dumex_fast5_version = DEMUX_FAST5.out.versions - demultiplexed_fast5 = DEMUX_FAST5.out.fast5 - - emit: - guppy_version - ch_guppy_summary - ch_fastq - //demultiplexed_fast5 - dumex_fast5_version - -} diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index c82536fe..95d860f9 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -17,70 +17,70 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample // Function to check if running offline def isOffline() { - try { - return NXF_OFFLINE as Boolean - } - catch( Exception e ) { - return false - } + try { + return NXF_OFFLINE as Boolean + } + catch( Exception e ) { + return false + } } def ch_guppy_model = Channel.empty() def ch_guppy_config = Channel.empty() if (!params.skip_basecalling) { - // Need to stage guppy_config properly depending on whether its a file or string - if (!params.guppy_config) { - if (!params.flowcell) { exit 1, "Please specify a valid flowcell identifier for basecalling!" } - if (!params.kit) { exit 1, "Please specify a valid kit identifier for basecalling!" } - } else if (file(params.guppy_config).exists()) { - ch_guppy_config = Channel.fromPath(params.guppy_config) - } - - // Need to stage guppy_model properly depending on whether its a file or string - if (params.guppy_model) { - if (file(params.guppy_model).exists()) { - ch_guppy_model = Channel.fromPath(params.guppy_model) - } - } + // Need to stage guppy_config properly depending on whether its a file or string + if (!params.guppy_config) { + if (!params.flowcell) { exit 1, "Please specify a valid flowcell identifier for basecalling!" } + if (!params.kit) { exit 1, "Please specify a valid kit identifier for basecalling!" } + } else if (file(params.guppy_config).exists()) { + ch_guppy_config = Channel.fromPath(params.guppy_config) + } + + // Need to stage guppy_model properly depending on whether its a file or string + if (params.guppy_model) { + if (file(params.guppy_model).exists()) { + ch_guppy_model = Channel.fromPath(params.guppy_model) + } + } } else { - if (!params.skip_demultiplexing) { - if (!params.barcode_kit) { - params.barcode_kit = 'Auto' - } - - def qcatBarcodeKitList = ['Auto', 'RBK001', 'RBK004', 'NBD103/NBD104', - 'NBD114', 'NBD104/NBD114', 'PBC001', 'PBC096', - 'RPB004/RLB001', 'PBK004/LWB001', 'RAB204', 'VMK001', 'DUAL'] - - if (params.barcode_kit && qcatBarcodeKitList.contains(params.barcode_kit)) { - if (params.input_path) { - ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) - } else { - exit 1, "Please specify a valid input fastq file to perform demultiplexing!" - } - } else { - exit 1, "Please provide a barcode kit to demultiplex with qcat. Valid options: ${qcatBarcodeKitList}" - } - } + if (!params.skip_demultiplexing) { + if (!params.barcode_kit) { + params.barcode_kit = 'Auto' + } + + def qcatBarcodeKitList = ['Auto', 'RBK001', 'RBK004', 'NBD103/NBD104', + 'NBD114', 'NBD104/NBD114', 'PBC001', 'PBC096', + 'RPB004/RLB001', 'PBK004/LWB001', 'RAB204', 'VMK001', 'DUAL'] + + if (params.barcode_kit && qcatBarcodeKitList.contains(params.barcode_kit)) { + if (params.input_path) { + ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) + } else { + exit 1, "Please specify a valid input fastq file to perform demultiplexing!" + } + } else { + exit 1, "Please provide a barcode kit to demultiplex with qcat. Valid options: ${qcatBarcodeKitList}" + } + } } if (!params.skip_alignment) { - if (params.aligner != 'minimap2' && params.aligner != 'graphmap2') { - exit 1, "Invalid aligner option: ${params.aligner}. Valid options: 'minimap2', 'graphmap2'" - } - if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { - exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" - } + if (params.aligner != 'minimap2' && params.aligner != 'graphmap2') { + exit 1, "Invalid aligner option: ${params.aligner}. Valid options: 'minimap2', 'graphmap2'" + } + if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { + exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" + } } if (!params.skip_quantification) { - if (params.quantification_method != 'bambu' && params.quantification_method != 'stringtie2') { - exit 1, "Invalid transcript quantification option: ${params.quantification_method}. Valid options: 'bambu', 'stringtie2'" - } - if (params.protocol != 'cDNA' && params.protocol != 'directRNA') { - exit 1, "Invalid protocol option if performing quantification: ${params.protocol}. Valid options: 'cDNA', 'directRNA'" - } + if (params.quantification_method != 'bambu' && params.quantification_method != 'stringtie2') { + exit 1, "Invalid transcript quantification option: ${params.quantification_method}. Valid options: 'bambu', 'stringtie2'" + } + if (params.protocol != 'cDNA' && params.protocol != 'directRNA') { + exit 1, "Invalid protocol option if performing quantification: ${params.protocol}. Valid options: 'cDNA', 'directRNA'" + } } //////////////////////////////////////////////////// @@ -101,12 +101,16 @@ def multiqc_options = modules['multiqc'] multiqc_options.args += params.multiqc_title ? " --title \"$params.multiqc_title\"" : '' if (params.skip_alignment) { multiqc_options['publish_dir'] = '' } +def guppy_options = modules['guppy'] +def demux_fast5_options = modules['guppy'] def qcat_options = modules['qcat'] def nanolyse_options = modules['nanolyse'] def bambu_options = modules['bambu'] include { GET_TEST_DATA } from '../modules/local/get_test_data' addParams( options: [:] ) include { GET_NANOLYSE_FASTA } from '../modules/local/get_nanolyse_fasta' addParams( options: [:] ) +include { GUPPY } from '../modules/local/guppy' addParams( options: guppy_options ) +include { DEMUX_FAST5 } from '../modules/local/demux_fast5' addParams( options: demux_fast5_options ) include { QCAT } from '../modules/local/qcat' addParams( options: qcat_options ) include { BAM_RENAME } from '../modules/local/bam_rename' addParams( options: [:] ) include { BAMBU } from '../modules/local/bambu' addParams( options: bambu_options ) @@ -116,8 +120,6 @@ include { MULTIQC } from '../modules/local/multiqc' /* * SUBWORKFLOW: Consisting of a mix of local and nf-core/modules */ -def guppy_options = modules['guppy'] -def demux_fast5_options = modules['demux_fast5'] def pycoqc_options = modules['pycoqc'] def nanoplot_options = modules['nanoplot'] def fastqc_options = modules['fastqc'] @@ -135,7 +137,6 @@ def deseq2_options = modules['deseq2'] def dexseq_options = modules['dexseq'] include { INPUT_CHECK } from '../subworkflows/local/input_check' addParams( options: [:] ) -include { GUPPY_BASECALL_DEMULTIPLEX } from '../subworkflows/local/guppy_basecall_demultiplex' addParams( guppy_options: guppy_options, demux_fast5_options: demux_fast5_options ) include { PREPARE_GENOME } from '../subworkflows/local/prepare_genome' addParams( genome_options: genome_options ) include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' addParams( index_options: graphmap2_index_options, align_options: graphmap2_align_options, samtools_options: samtools_sort_options ) include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' addParams( index_options: minimap2_index_options, align_options: minimap2_align_options, samtools_options: samtools_sort_options ) @@ -169,277 +170,286 @@ def multiqc_report = [] workflow NANOSEQ{ - /* - * SUBWORKFLOW: Read in samplesheet, validate and stage input files - */ - INPUT_CHECK ( ch_input ) - .set { ch_sample } - - ch_software_versions = Channel.empty() - if (!params.skip_basecalling){ - ch_sample - .first() - .map { it[0] } - .set { ch_sample_name } - - // Pre-download test-dataset to get files for '--input_path' parameter - // Nextflow is unable to recursively download directories via HTTPS - if (workflow.profile.contains('test')) { - if (!isOffline()) { - GET_TEST_DATA ().set { ch_input_path } - } else { - exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download and run any test dataset!" - } - } else { - if (params.input_path) { - ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) - } - } - /* - * SUBWORKFLOW: Basecalling and demultiplexing fast5 using Guppy and ont_fast5_api - */ - GUPPY_BASECALL_DEMULTIPLEX ( ch_input_path, ch_sample_name, ch_guppy_config.ifEmpty([]), ch_guppy_model.ifEmpty([]), ch_sample ) - ch_guppy_summary = GUPPY_BASECALL_DEMULTIPLEX.out.ch_guppy_summary - ch_software_versions = ch_software_versions.mix(GUPPY_BASECALL_DEMULTIPLEX.out.guppy_version.first().ifEmpty(null)) - ch_fastq = GUPPY_BASECALL_DEMULTIPLEX.out.ch_fastq + /* + * SUBWORKFLOW: Read in samplesheet, validate and stage input files + */ + INPUT_CHECK ( ch_input ) + .set { ch_sample } + + ch_software_versions = Channel.empty() + if (!params.skip_basecalling){ + ch_sample + .first() + .map { it[0] } + .set { ch_sample_name } + + // Pre-download test-dataset to get files for '--input_path' parameter + // Nextflow is unable to recursively download directories via HTTPS + if (workflow.profile.contains('test')) { + if (!isOffline()) { + GET_TEST_DATA ().set { ch_input_path } + } else { + exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download and run any test dataset!" + } + } else { + if (params.input_path) { + ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) + } + } + /* + * MODULE: Basecalling and demultipexing using Guppy + */ + GUPPY ( ch_input_path, ch_sample_name, ch_guppy_config.ifEmpty([]), ch_guppy_model.ifEmpty([]) ) + ch_guppy_summary = GUPPY.out.summary + ch_software_versions = ch_software_versions.mix(GUPPY.out.versions.ifEmpty(null)) + + if (params.skip_demultiplexing){ + ch_sample + .map { it -> [ it[0], it[0].id, it[2], it[3], it[4], it[5] ] } + .set { ch_sample } + } + + GUPPY.out.fastq + .flatten() + .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.')) ] } + .join(ch_sample, by: 1) // join on barcode + .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } + .set { ch_fastq } + + if (params.output_demultiplex_fast5) { + + /* + * MODULE: Demultiplex fast5 files using ont_fast5_api/demux_fast5 + */ + DEMUX_FAST5 ( ch_input_path, ch_guppy_summary ) + ch_software_versions = ch_software_versions.mix(DEMUX_FAST5.out.versions.ifEmpty(null)) + } + + } else { + ch_guppy_summary = Channel.empty() + - ch_software_versions = ch_software_versions.mix(GUPPY_BASECALL_DEMULTIPLEX.out.dumex_fast5_version.ifEmpty(null)) - // if (params.skip_demultiplexing){ - // ch_sample - // .map { it -> [ it[0], it[0].id, it[2], it[3], it[4], it[5] ] } - // .set { ch_sample } - // } - - // GUPPY.out.fastq - // .flatten() - // .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.')) ] } - // .join(ch_sample, by: 1) // join on barcode - // .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } - // .set { ch_fastq } - } else { - ch_guppy_summary = Channel.empty() - - if (!params.skip_demultiplexing){ - - /* - * MODULE: Demultipexing using qcat - */ - QCAT ( ch_input_path ) - ch_fastq = Channel.empty() - QCAT.out.fastq - .flatten() - .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.'))] } - .join(ch_sample, by: 1) // join on barcode - .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } - .set { ch_fastq } - ch_software_versions = ch_software_versions.mix(QCAT.out.versions.ifEmpty(null)) - - } else { - if (!params.skip_alignment){ - ch_sample - .map { it -> if (it[6].toString().endsWith('.gz')) [ it[0], it[6], it[2], it[1], it[4], it[5] ] } - .set { ch_fastq } - } else { - ch_fastq = Channel.empty() - } - } - } - - if (params.run_nanolyse) { - ch_fastq - .map { it -> [ it[0], it[1] ] } - .set { ch_fastq_nanolyse } - - if (!params.nanolyse_fasta){ - if (!isOffline()){ - GET_NANOLYSE_FASTA ().set { ch_nanolyse_fasta } - } else { - exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download lambda.fasta.gz file for running NanoLyse! Please explicitly specify --nanolyse_fasta." - } - } else { - ch_nanolyse_fasta = file(params.nanolyse_fasta, checkIfExists: true) - } - /* - * MODULE: DNA contaminant removal using NanoLyse - */ - NANOLYSE ( ch_fastq_nanolyse, ch_nanolyse_fasta ) - NANOLYSE.out.fastq - .join( ch_sample ) - .map { it -> [ it[0], it[1], it[3], it[4], it[5], it[6] ]} - .set { ch_fastq } - ch_software_versions = ch_software_versions.mix(NANOLYSE.out.versions.first().ifEmpty(null)) - } - - ch_pycoqc_multiqc = Channel.empty() - ch_fastqc_multiqc = Channel.empty() - if (!params.skip_qc){ - if (!params.skip_basecalling){ - - /* - * SUBWORKFLOW: Basecalling QC with PycoQC and Nanoplot - */ - QCBASECALL_PYCOQC_NANOPLOT ( ch_guppy_summary , params.skip_pycoqc, params.skip_nanoplot ) - ch_software_versions = ch_software_versions.mix(QCBASECALL_PYCOQC_NANOPLOT.out.pycoqc_version.first().ifEmpty(null)) - ch_pycoqc_multiqc = QCBASECALL_PYCOQC_NANOPLOT.out.pycoqc_multiqc.ifEmpty([]) - } - - /* - * SUBWORKFLOW: Fastq QC with Nanoplot and fastqc - */ - QCFASTQ_NANOPLOT_FASTQC ( ch_fastq, params.skip_nanoplot, params.skip_fastqc) - if (params.skip_basecalling){ - ch_software_versions = ch_software_versions.mix(QCFASTQ_NANOPLOT_FASTQC.out.nanoplot_version.first().ifEmpty(null)) - } - ch_software_versions = ch_software_versions.mix(QCFASTQ_NANOPLOT_FASTQC.out.fastqc_version.first().ifEmpty(null)) - ch_fastqc_multiqc = QCFASTQ_NANOPLOT_FASTQC.out.fastqc_multiqc.ifEmpty([]) - } - - ch_samtools_multiqc = Channel.empty() - if (!params.skip_alignment){ - - /* - * SUBWORKFLOW: Make chromosome size file and covert GTF to BED12 - */ - PREPARE_GENOME ( ch_fastq ) - ch_fasta_index = PREPARE_GENOME.out.ch_fasta_index - ch_gtf_bed = PREPARE_GENOME.out.ch_gtf_bed - ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.samtools_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.gtf2bed_version.first().ifEmpty(null)) - if (params.aligner == 'minimap2') { - - /* - * SUBWORKFLOW: Align fastq files with minimap2 and sort bam files - */ - ALIGN_MINIMAP2 ( ch_fasta_index, ch_fastq ) - ch_view_sortbam = ALIGN_MINIMAP2.out.ch_sortbam - ch_software_versions = ch_software_versions.mix(ALIGN_MINIMAP2.out.minimap2_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(ALIGN_MINIMAP2.out.samtools_version.first().ifEmpty(null)) - ch_samtools_multiqc = ALIGN_MINIMAP2.out.ch_sortbam_stats_multiqc.ifEmpty([]) - } else { - - /* - * SUBWORKFLOW: Align fastq files with graphmap2 and sort bam files - */ - ALIGN_GRAPHMAP2 ( ch_fasta_index, ch_fastq ) - ch_view_sortbam = ALIGN_GRAPHMAP2.out.ch_sortbam - ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.graphmap2_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.samtools_version.first().ifEmpty(null)) - ch_samtools_multiqc = ALIGN_GRAPHMAP2.out.ch_sortbam_stats_multiqc.ifEmpty([]) - } - - ch_bedtools_version = Channel.empty() - if (!params.skip_bigwig){ - - /* - * SUBWORKFLOW: Convert BAM -> BEDGraph -> BigWig - */ - BEDTOOLS_UCSC_BIGWIG ( ch_view_sortbam ) - ch_bedtools_version = ch_bedtools_version.mix(BEDTOOLS_UCSC_BIGWIG.out.bedtools_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(BEDTOOLS_UCSC_BIGWIG.out.bedgraphtobigwig_version.first().ifEmpty(null)) - } - if (!params.skip_bigbed){ - - /* - * SUBWORKFLOW: Convert BAM -> BED12 -> BigBED - */ - BEDTOOLS_UCSC_BIGBED ( ch_view_sortbam ) - ch_bedtools_version = ch_bedtools_version.mix(BEDTOOLS_UCSC_BIGBED.out.bedtools_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(BEDTOOLS_UCSC_BIGBED.out.bed12tobigbed_version.first().ifEmpty(null)) - } - ch_software_versions = ch_software_versions.mix(ch_bedtools_version.first().ifEmpty(null)) - - ch_view_sortbam - .map { it -> [ it[0], it[3] ] } - .set { ch_sortbam } - } else { - ch_sample - .map { it -> if (it[6].toString().endsWith('.bam')) [ it[0], it[6] ] } - .set { ch_sample_bam } - BAM_RENAME ( ch_sample_bam ) - ch_sortbam = BAM_RENAME.out.bam - } - - ch_featurecounts_gene_multiqc = Channel.empty() - ch_featurecounts_transcript_multiqc = Channel.empty() - if (!params.skip_quantification && (params.protocol == 'cDNA' || params.protocol == 'directRNA')) { - - // Check that reference genome and annotation are the same for all samples if perfoming quantification - // Check if we have replicates and multiple conditions in the input samplesheet - REPLICATES_EXIST = false - MULTIPLE_CONDITIONS = false - ch_sample.map{ it[2] }.unique().toList().set { fastas } - ch_sample.map{ it[3] }.unique().toList().set { gtfs } - // BUG: ".val" halts the pipeline /////////////////////// - // if ( gtfs.map{it[0]} == false || fastas.map{it[0]} == false || gtfs.size().val != 1 || fasta.size().val != 1 ) { - // exit 1, """Quantification can only be performed if all samples in the samplesheet have the same reference fasta and GTF file." - // Please specify the '--skip_quantification' parameter if you wish to skip these steps.""" - // } - // REPLICATES_EXIST = ch_sample.map { it -> it[0].split('_')[-1].replaceAll('R','').toInteger() }.max().val > 1 - // MULTIPLE_CONDITIONS = ch_sample.map { it -> it[0].split('_')[0..-2].join('_') }.unique().count().val > 1 - - ch_r_version = Channel.empty() - if (params.quantification_method == 'bambu') { - ch_sample - .map { it -> [ it[2], it[3] ]} - .unique() - .set { ch_sample_annotation } - - /* - * MODULE: Quantification and novel isoform detection with bambu - */ - BAMBU ( ch_sample_annotation, ch_sortbam.collect{ it [1] } ) - ch_gene_counts = BAMBU.out.ch_gene_counts - ch_transcript_counts = BAMBU.out.ch_transcript_counts - ch_software_versions = ch_software_versions.mix(BAMBU.out.versions.first().ifEmpty(null)) - } else { - /* - * SUBWORKFLOW: Novel isoform detection with StringTie and Quantification with featureCounts - */ - QUANTIFY_STRINGTIE_FEATURECOUNTS( ch_sample, ch_sortbam ) - ch_gene_counts = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.ch_gene_counts - ch_transcript_counts = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.ch_transcript_counts - ch_software_versions = ch_software_versions.mix(QUANTIFY_STRINGTIE_FEATURECOUNTS.out.stringtie2_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(QUANTIFY_STRINGTIE_FEATURECOUNTS.out.featurecounts_version.first().ifEmpty(null)) - ch_featurecounts_gene_multiqc = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.featurecounts_gene_multiqc.ifEmpty([]) - ch_featurecounts_transcript_multiqc = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.featurecounts_transcript_multiqc.ifEmpty([]) - } - if (!params.skip_differential_analysis) { - - /* - * SUBWORKFLOW: Differential gene and transcript analysis with DESeq2 and DEXseq - */ - DIFFERENTIAL_DESEQ2_DEXSEQ( ch_gene_counts, ch_transcript_counts ) - ch_software_versions = ch_software_versions.mix(DIFFERENTIAL_DESEQ2_DEXSEQ.out.deseq2_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(DIFFERENTIAL_DESEQ2_DEXSEQ.out.dexseq_version.first().ifEmpty(null)) - } - } - - /* - * MODULE: Parse software version numbers - */ - CUSTOM_DUMPSOFTWAREVERSIONS ( - ch_software_versions.unique().collectFile() - ) - - if (!params.skip_multiqc){ - workflow_summary = Schema.params_summary_multiqc(workflow, params.summary_params) - ch_workflow_summary = Channel.value(workflow_summary).collectFile(name: 'workflow_summary_mqc.yaml') - - /* - * MODULE: MultiQC - */ - MULTIQC ( - ch_multiqc_config, - ch_multiqc_custom_config.collect().ifEmpty([]), - ch_pycoqc_multiqc.collect().ifEmpty([]), - ch_fastqc_multiqc.ifEmpty([]), - ch_samtools_multiqc.collect().ifEmpty([]), - ch_featurecounts_gene_multiqc.ifEmpty([]), - ch_featurecounts_transcript_multiqc.ifEmpty([]), - CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), - ch_workflow_summary - ) - } + if (!params.skip_demultiplexing){ + + /* + * MODULE: Demultipexing using qcat + */ + QCAT ( ch_input_path ) + ch_fastq = Channel.empty() + QCAT.out.fastq + .flatten() + .map { it -> [ it, it.baseName.substring(0,it.baseName.lastIndexOf('.'))] } + .join(ch_sample, by: 1) // join on barcode + .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } + .set { ch_fastq } + ch_software_versions = ch_software_versions.mix(QCAT.out.versions.ifEmpty(null)) + + } else { + if (!params.skip_alignment){ + ch_sample + .map { it -> if (it[6].toString().endsWith('.gz')) [ it[0], it[6], it[2], it[1], it[4], it[5] ] } + .set { ch_fastq } + } else { + ch_fastq = Channel.empty() + } + } + } + + if (params.run_nanolyse) { + ch_fastq + .map { it -> [ it[0], it[1] ] } + .set { ch_fastq_nanolyse } + + if (!params.nanolyse_fasta){ + if (!isOffline()){ + GET_NANOLYSE_FASTA ().set { ch_nanolyse_fasta } + } else { + exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download lambda.fasta.gz file for running NanoLyse! Please explicitly specify --nanolyse_fasta." + } + } else { + ch_nanolyse_fasta = file(params.nanolyse_fasta, checkIfExists: true) + } + /* + * MODULE: DNA contaminant removal using NanoLyse + */ + NANOLYSE ( ch_fastq_nanolyse, ch_nanolyse_fasta ) + NANOLYSE.out.fastq + .join( ch_sample ) + .map { it -> [ it[0], it[1], it[3], it[4], it[5], it[6] ]} + .set { ch_fastq } + ch_software_versions = ch_software_versions.mix(NANOLYSE.out.versions.first().ifEmpty(null)) + } + + ch_pycoqc_multiqc = Channel.empty() + ch_fastqc_multiqc = Channel.empty() + if (!params.skip_qc){ + if (!params.skip_basecalling){ + + /* + * SUBWORKFLOW: Basecalling QC with PycoQC and Nanoplot + */ + QCBASECALL_PYCOQC_NANOPLOT ( ch_guppy_summary , params.skip_pycoqc, params.skip_nanoplot ) + ch_software_versions = ch_software_versions.mix(QCBASECALL_PYCOQC_NANOPLOT.out.pycoqc_version.first().ifEmpty(null)) + ch_pycoqc_multiqc = QCBASECALL_PYCOQC_NANOPLOT.out.pycoqc_multiqc.ifEmpty([]) + } + + /* + * SUBWORKFLOW: Fastq QC with Nanoplot and fastqc + */ + QCFASTQ_NANOPLOT_FASTQC ( ch_fastq, params.skip_nanoplot, params.skip_fastqc) + if (params.skip_basecalling){ + ch_software_versions = ch_software_versions.mix(QCFASTQ_NANOPLOT_FASTQC.out.nanoplot_version.first().ifEmpty(null)) + } + ch_software_versions = ch_software_versions.mix(QCFASTQ_NANOPLOT_FASTQC.out.fastqc_version.first().ifEmpty(null)) + ch_fastqc_multiqc = QCFASTQ_NANOPLOT_FASTQC.out.fastqc_multiqc.ifEmpty([]) + } + + ch_samtools_multiqc = Channel.empty() + if (!params.skip_alignment){ + + /* + * SUBWORKFLOW: Make chromosome size file and covert GTF to BED12 + */ + PREPARE_GENOME ( ch_fastq ) + ch_fasta_index = PREPARE_GENOME.out.ch_fasta_index + ch_gtf_bed = PREPARE_GENOME.out.ch_gtf_bed + ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.samtools_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.gtf2bed_version.first().ifEmpty(null)) + if (params.aligner == 'minimap2') { + + /* + * SUBWORKFLOW: Align fastq files with minimap2 and sort bam files + */ + ALIGN_MINIMAP2 ( ch_fasta_index, ch_fastq ) + ch_view_sortbam = ALIGN_MINIMAP2.out.ch_sortbam + ch_software_versions = ch_software_versions.mix(ALIGN_MINIMAP2.out.minimap2_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(ALIGN_MINIMAP2.out.samtools_version.first().ifEmpty(null)) + ch_samtools_multiqc = ALIGN_MINIMAP2.out.ch_sortbam_stats_multiqc.ifEmpty([]) + } else { + + /* + * SUBWORKFLOW: Align fastq files with graphmap2 and sort bam files + */ + ALIGN_GRAPHMAP2 ( ch_fasta_index, ch_fastq ) + ch_view_sortbam = ALIGN_GRAPHMAP2.out.ch_sortbam + ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.graphmap2_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(ALIGN_GRAPHMAP2.out.samtools_version.first().ifEmpty(null)) + ch_samtools_multiqc = ALIGN_GRAPHMAP2.out.ch_sortbam_stats_multiqc.ifEmpty([]) + } + + ch_bedtools_version = Channel.empty() + if (!params.skip_bigwig){ + + /* + * SUBWORKFLOW: Convert BAM -> BEDGraph -> BigWig + */ + BEDTOOLS_UCSC_BIGWIG ( ch_view_sortbam ) + ch_bedtools_version = ch_bedtools_version.mix(BEDTOOLS_UCSC_BIGWIG.out.bedtools_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(BEDTOOLS_UCSC_BIGWIG.out.bedgraphtobigwig_version.first().ifEmpty(null)) + } + if (!params.skip_bigbed){ + + /* + * SUBWORKFLOW: Convert BAM -> BED12 -> BigBED + */ + BEDTOOLS_UCSC_BIGBED ( ch_view_sortbam ) + ch_bedtools_version = ch_bedtools_version.mix(BEDTOOLS_UCSC_BIGBED.out.bedtools_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(BEDTOOLS_UCSC_BIGBED.out.bed12tobigbed_version.first().ifEmpty(null)) + } + ch_software_versions = ch_software_versions.mix(ch_bedtools_version.first().ifEmpty(null)) + + ch_view_sortbam + .map { it -> [ it[0], it[3] ] } + .set { ch_sortbam } + } else { + ch_sample + .map { it -> if (it[6].toString().endsWith('.bam')) [ it[0], it[6] ] } + .set { ch_sample_bam } + BAM_RENAME ( ch_sample_bam ) + ch_sortbam = BAM_RENAME.out.bam + } + + ch_featurecounts_gene_multiqc = Channel.empty() + ch_featurecounts_transcript_multiqc = Channel.empty() + if (!params.skip_quantification && (params.protocol == 'cDNA' || params.protocol == 'directRNA')) { + + // Check that reference genome and annotation are the same for all samples if perfoming quantification + // Check if we have replicates and multiple conditions in the input samplesheet + REPLICATES_EXIST = false + MULTIPLE_CONDITIONS = false + ch_sample.map{ it[2] }.unique().toList().set { fastas } + ch_sample.map{ it[3] }.unique().toList().set { gtfs } + // BUG: ".val" halts the pipeline /////////////////////// + // if ( gtfs.map{it[0]} == false || fastas.map{it[0]} == false || gtfs.size().val != 1 || fasta.size().val != 1 ) { + // exit 1, """Quantification can only be performed if all samples in the samplesheet have the same reference fasta and GTF file." + // Please specify the '--skip_quantification' parameter if you wish to skip these steps.""" + // } + // REPLICATES_EXIST = ch_sample.map { it -> it[0].split('_')[-1].replaceAll('R','').toInteger() }.max().val > 1 + // MULTIPLE_CONDITIONS = ch_sample.map { it -> it[0].split('_')[0..-2].join('_') }.unique().count().val > 1 + + ch_r_version = Channel.empty() + if (params.quantification_method == 'bambu') { + ch_sample + .map { it -> [ it[2], it[3] ]} + .unique() + .set { ch_sample_annotation } + + /* + * MODULE: Quantification and novel isoform detection with bambu + */ + BAMBU ( ch_sample_annotation, ch_sortbam.collect{ it [1] } ) + ch_gene_counts = BAMBU.out.ch_gene_counts + ch_transcript_counts = BAMBU.out.ch_transcript_counts + ch_software_versions = ch_software_versions.mix(BAMBU.out.versions.first().ifEmpty(null)) + } else { + /* + * SUBWORKFLOW: Novel isoform detection with StringTie and Quantification with featureCounts + */ + QUANTIFY_STRINGTIE_FEATURECOUNTS( ch_sample, ch_sortbam ) + ch_gene_counts = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.ch_gene_counts + ch_transcript_counts = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.ch_transcript_counts + ch_software_versions = ch_software_versions.mix(QUANTIFY_STRINGTIE_FEATURECOUNTS.out.stringtie2_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(QUANTIFY_STRINGTIE_FEATURECOUNTS.out.featurecounts_version.first().ifEmpty(null)) + ch_featurecounts_gene_multiqc = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.featurecounts_gene_multiqc.ifEmpty([]) + ch_featurecounts_transcript_multiqc = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.featurecounts_transcript_multiqc.ifEmpty([]) + } + if (!params.skip_differential_analysis) { + + /* + * SUBWORKFLOW: Differential gene and transcript analysis with DESeq2 and DEXseq + */ + DIFFERENTIAL_DESEQ2_DEXSEQ( ch_gene_counts, ch_transcript_counts ) + ch_software_versions = ch_software_versions.mix(DIFFERENTIAL_DESEQ2_DEXSEQ.out.deseq2_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(DIFFERENTIAL_DESEQ2_DEXSEQ.out.dexseq_version.first().ifEmpty(null)) + } + } + + /* + * MODULE: Parse software version numbers + */ + CUSTOM_DUMPSOFTWAREVERSIONS ( + ch_software_versions.unique().collectFile() + ) + + if (!params.skip_multiqc){ + workflow_summary = Schema.params_summary_multiqc(workflow, params.summary_params) + ch_workflow_summary = Channel.value(workflow_summary).collectFile(name: 'workflow_summary_mqc.yaml') + + /* + * MODULE: MultiQC + */ + MULTIQC ( + ch_multiqc_config, + ch_multiqc_custom_config.collect().ifEmpty([]), + ch_pycoqc_multiqc.collect().ifEmpty([]), + ch_fastqc_multiqc.ifEmpty([]), + ch_samtools_multiqc.collect().ifEmpty([]), + ch_featurecounts_gene_multiqc.ifEmpty([]), + ch_featurecounts_transcript_multiqc.ifEmpty([]), + CUSTOM_DUMPSOFTWAREVERSIONS.out.mqc_yml.collect(), + ch_workflow_summary + ) + } } //////////////////////////////////////////////////// @@ -448,9 +458,9 @@ workflow NANOSEQ{ workflow.onComplete { // Completion.email(workflow, params, params.summary_params, log, multiqc_report) - Completion.summary(workflow, params, log) + Completion.summary(workflow, params, log) } //////////////////////////////////////////////////// /* -- THE END -- */ -//////////////////////////////////////////////////// +//////////////////////////////////////////////////// \ No newline at end of file From 063bbc3abe6ceecaa4f9f8578aac9830eee99c89 Mon Sep 17 00:00:00 2001 From: ekushele Date: Thu, 20 Jan 2022 19:42:21 +0200 Subject: [PATCH 058/169] update CHANGELOD.md file --- CHANGELOG.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 35bb59c2..5bb06eb8 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [2.0.2] - date + +### Major enhancements + +* Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set +* ADD `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq + ## [2.0.1] - 2021-11-29 ### Bug fix From f01a8de836b884b761009cd04ca6ad27b7f48978 Mon Sep 17 00:00:00 2001 From: ekushele Date: Thu, 20 Jan 2022 19:45:12 +0200 Subject: [PATCH 059/169] typo error --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5bb06eb8..8894b548 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Major enhancements * Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set -* ADD `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq +* Add `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq ## [2.0.1] - 2021-11-29 From f478959b84749133efc1ecab2820e41eb59fa708 Mon Sep 17 00:00:00 2001 From: ekushele Date: Thu, 20 Jan 2022 20:18:42 +0200 Subject: [PATCH 060/169] update test and README.md --- README.md | 4 ++-- conf/test.config | 27 ++++++++++++++------------- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 44666d41..c88a3d68 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ On release, automated continuous integration tests run the pipeline on a [full-s ## Pipeline Summary -1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis) or [`qcat`](https://github.com/nanoporetech/qcat); *optional*) +1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis), [`demux_fast5`](https://github.com/nanoporetech/ont_fast5_api#demux_fast5) or [`qcat`](https://github.com/nanoporetech/qcat); *optional*) 2. Sequencing QC ([`pycoQC`](https://github.com/a-slide/pycoQC), [`NanoPlot`](https://github.com/wdecoster/NanoPlot)) 3. Raw read DNA cleaning ([NanoLyse](https://github.com/wdecoster/nanolyse); *optional*) 4. Raw read QC ([`NanoPlot`](https://github.com/wdecoster/NanoPlot), [`FastQC`](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) @@ -88,7 +88,7 @@ An example input samplesheet for performing both basecalling and demultiplexing nf-core/nanoseq was originally written by [Chelsea Sawyer](https://github.com/csawye01) and [Harshil Patel](https://github.com/drpatelh) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) for use at [The Francis Crick Institute](https://www.crick.ac.uk/), London. Other primary contributors include [Laura Wratten](https://github.com/lwratten), [Ying Chen](https://github.com/cying111), [Yuk Kei Wan](https://github.com/yuukiiwa) and [Jonathan Goeke](https://github.com/jonathangoeke) from the [Genome Institute of Singapore](https://www.a-star.edu.sg/gis), [Johannes Alneberg](https://github.com/alneberg) and [Franziska Bonath](https://github.com/FranBonath) from [SciLifeLab](https://www.scilifelab.se/), Sweden. -Many thanks to others who have helped out along the way too, including (but not limited to): [@crickbabs](https://github.com/crickbabs), [@AnnaSyme](https://github.com/AnnaSyme). +Many thanks to others who have helped out along the way too, including (but not limited to): [@crickbabs](https://github.com/crickbabs), [@AnnaSyme](https://github.com/AnnaSyme),[@ekushele](https://github.com/ekushele). ## Contributions and Support diff --git a/conf/test.config b/conf/test.config index b4b12b00..3b253381 100644 --- a/conf/test.config +++ b/conf/test.config @@ -15,19 +15,20 @@ params { config_profile_description = 'Minimal test dataset to check pipeline function' // Limit resources so that this can run on GitHub Actions - max_cpus = 2 - max_memory = 6.GB - max_time = 12.h - - // Input data to perform both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' - protocol = 'cDNA' - flowcell = 'FLO-MIN106' - kit = 'SQK-DCS109' - barcode_kit = 'EXP-NBD103' - run_nanolyse = true - skip_quantification = true - + max_cpus = 2 + max_memory = 6.GB + max_time = 12.h + + // Input data to per form both basecalling and demultiplexing + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' + protocol = 'cDNA' + flowcell = 'FLO-MIN106' + kit = 'SQK-DCS109' + barcode_kit = 'EXP-NBD103' + output_demultiplex_fast5 = true + run_nanolyse = true + skip_quantification = true + // This variable is just for reference and isnt actually required for the tests // Files are downloaded and staged using the "GetTestData" process input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/barcoded/' From 972ae9fa231f68f0337a7899a48514fb56280b05 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 21 Jan 2022 10:48:12 +0800 Subject: [PATCH 061/169] update to bambu2.0 --- .github/workflows/ci.yml | 27 +------------------ conf/test_bc_nodx.config | 0 conf/test_nobc_dx.config | 0 conf/test_nobc_nodx_noaln.config | 2 +- ...config => test_nobc_nodx_stringtie.config} | 1 + nextflow.config | 12 ++++----- 6 files changed, 9 insertions(+), 33 deletions(-) mode change 100755 => 100644 conf/test_bc_nodx.config mode change 100755 => 100644 conf/test_nobc_dx.config rename conf/{test_nobc_nodx.config => test_nobc_nodx_stringtie.config} (95%) mode change 100755 => 100644 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index e0875eb4..8e80f214 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,7 @@ jobs: NXF_ANSI_LOG: false strategy: matrix: - profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx_vc, test_nobc_nodx, test_nobc_nodx_noaln, test_nobc_nodx_rnamod] + profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx_vc, test_nobc_nodx_stringtie, test_nobc_nodx_noaln, test_nobc_nodx_rnamod] steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -95,28 +95,3 @@ jobs: - name: Run pipeline with different parameters run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} - - quantification: - name: Run quantification tests - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} - runs-on: ubuntu-latest - env: - NXF_VER: '21.10.3' - NXF_ANSI_LOG: false - strategy: - matrix: - parameters: [--quantification_method 'stringtie2', --skip_quantification, --skip_differential_analysis] - steps: - - name: Check out pipeline code - uses: actions/checkout@v2 - - - name: Install Nextflow - env: - CAPSULE_LOG: none - run: | - wget -qO- get.nextflow.io | bash - sudo mv nextflow /usr/local/bin/ - - - name: Run pipeline with different quantification parameters - run: | - nextflow run ${GITHUB_WORKSPACE} -profile test_nobc_nodx,docker ${{ matrix.parameters }} diff --git a/conf/test_bc_nodx.config b/conf/test_bc_nodx.config old mode 100755 new mode 100644 diff --git a/conf/test_nobc_dx.config b/conf/test_nobc_dx.config old mode 100755 new mode 100644 diff --git a/conf/test_nobc_nodx_noaln.config b/conf/test_nobc_nodx_noaln.config index bec8d2cc..75896fd1 100644 --- a/conf/test_nobc_nodx_noaln.config +++ b/conf/test_nobc_nodx_noaln.config @@ -13,7 +13,7 @@ params { // Limit resources so that this can run on Travis max_cpus = 2 - max_memory = 6.GB + max_memory = 6.5.GB max_time = 12.h // Input data to skip both basecalling and demultiplexing diff --git a/conf/test_nobc_nodx.config b/conf/test_nobc_nodx_stringtie.config old mode 100755 new mode 100644 similarity index 95% rename from conf/test_nobc_nodx.config rename to conf/test_nobc_nodx_stringtie.config index d46704a1..a669bf07 --- a/conf/test_nobc_nodx.config +++ b/conf/test_nobc_nodx_stringtie.config @@ -23,4 +23,5 @@ params { skip_demultiplexing = true skip_fusion_analysis= true skip_modification_analysis=true + quantification_method = 'stringtie2' } diff --git a/nextflow.config b/nextflow.config index 8f202499..57f69ca7 100644 --- a/nextflow.config +++ b/nextflow.config @@ -175,12 +175,12 @@ profiles { } test { includeConfig 'conf/test.config' } test_full { includeConfig 'conf/test_full.config' } - test_bc_nodx { includeConfig 'conf/test_bc_nodx.config' } - test_nobc_dx { includeConfig 'conf/test_nobc_dx.config' } - test_nobc_nodx { includeConfig 'conf/test_nobc_nodx.config' } - test_nobc_nodx_noaln { includeConfig 'conf/test_nobc_nodx_noaln.config' } - test_nobc_nodx_vc { includeConfig 'conf/test_nobc_nodx_vc.config' } - test_nobc_nodx_rnamod { includeConfig 'conf/test_nobc_nodx_rnamod.config' } + test_bc_nodx { includeConfig 'conf/test_bc_nodx.config' } + test_nobc_dx { includeConfig 'conf/test_nobc_dx.config' } + test_nobc_nodx_stringtie { includeConfig 'conf/test_nobc_nodx_stringtie.config' } + test_nobc_nodx_noaln { includeConfig 'conf/test_nobc_nodx_noaln.config' } + test_nobc_nodx_vc { includeConfig 'conf/test_nobc_nodx_vc.config' } + test_nobc_nodx_rnamod { includeConfig 'conf/test_nobc_nodx_rnamod.config' } } // Load igenomes.config if required From d63a6e91b26e5b2830db8ad86beb1f23181d866e Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 21 Jan 2022 10:52:36 +0800 Subject: [PATCH 062/169] update samplesheet name --- conf/test_nobc_nodx_stringtie.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_stringtie.config b/conf/test_nobc_nodx_stringtie.config index a669bf07..e4b8093e 100644 --- a/conf/test_nobc_nodx_stringtie.config +++ b/conf/test_nobc_nodx_stringtie.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_stringtie.csv' protocol = 'directRNA' skip_basecalling = true skip_demultiplexing = true From 81874b3742ec09f153a33b51f5e715814688a9bc Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 21 Jan 2022 13:26:55 +0800 Subject: [PATCH 063/169] address comments from Christopher --- modules/local/jaffal.nf | 7 +++++-- modules/local/xpore_dataprep.nf | 6 ++++-- modules/local/xpore_diffmod.nf | 6 ++++-- subworkflows/local/rna_fusions_jaffal.nf | 8 ++++---- subworkflows/local/rna_modifications_xpore_m6anet.nf | 4 ++++ 5 files changed, 21 insertions(+), 10 deletions(-) diff --git a/modules/local/jaffal.nf b/modules/local/jaffal.nf index ea31478d..47c51d5d 100644 --- a/modules/local/jaffal.nf +++ b/modules/local/jaffal.nf @@ -3,8 +3,11 @@ process JAFFAL { echo true label 'process_medium' -// conda (params.enable_conda ? "bioconda::nanolyse=1.2.0" : null) //need conda container + conda (params.enable_conda ? "bioconda::jaffa=2.0.0" : null) container "docker.io/yuukiiwa/jaffa:2.0" + //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + // 'https://depot.galaxyproject.org/singularity/jaffa:2.00--hdfd78af_1' : + // 'quay.io/biocontainers/jaffa:2.00--hdfd78af_1' }"//tried three biocontainers, all of them got command not found for minimap2 input: tuple val(meta), path(fastq) @@ -18,6 +21,6 @@ process JAFFAL { script: """ bpipe run -p refBase=$jaffal_ref_dir $jaffal_ref_dir/JAFFAL.groovy $fastq - echo '2.0' > jaffal_version.txt + echo 'jaffa 2.0' > jaffal_version.txt """ } diff --git a/modules/local/xpore_dataprep.nf b/modules/local/xpore_dataprep.nf index e347db36..7545bab5 100644 --- a/modules/local/xpore_dataprep.nf +++ b/modules/local/xpore_dataprep.nf @@ -2,8 +2,10 @@ process XPORE_DATAPREP { tag "$meta.id" label 'process_medium' -// conda (params.enable_conda ? "bioconda::nanopolish==0.13.2" : null) // need to get xpore onto conda - container "docker.io/yuukiiwa/xpore:2.1" + conda (params.enable_conda ? "bioconda::xpore=2.1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/xpore:2.1--pyh5e36f6f_0' : + 'quay.io/biocontainers/xpore:2.1--pyh5e36f6f_0' }" input: tuple val(meta), path(genome), path(gtf), path(eventalign), path(nanopolish_summary) diff --git a/modules/local/xpore_diffmod.nf b/modules/local/xpore_diffmod.nf index bbc96405..7cc68469 100644 --- a/modules/local/xpore_diffmod.nf +++ b/modules/local/xpore_diffmod.nf @@ -1,8 +1,10 @@ process XPORE_DIFFMOD { label 'process_medium' -// conda (params.enable_conda ? "bioconda::nanopolish==0.13.2" : null) // need to get xpore onto conda - container "docker.io/yuukiiwa/xpore:2.1" + conda (params.enable_conda ? "bioconda::xpore=2.1.0" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/xpore:2.1--pyh5e36f6f_0' : + 'quay.io/biocontainers/xpore:2.1--pyh5e36f6f_0' }" input: val dataprep_dirs diff --git a/subworkflows/local/rna_fusions_jaffal.nf b/subworkflows/local/rna_fusions_jaffal.nf index e957ee18..5cb5b72e 100644 --- a/subworkflows/local/rna_fusions_jaffal.nf +++ b/subworkflows/local/rna_fusions_jaffal.nf @@ -1,3 +1,7 @@ +/* + * RNA FUSION DETECTION WITH JAFFAL + */ + include { GET_JAFFAL_REF } from '../../modules/local/get_jaffal_ref' include { UNTAR } from '../../modules/nf-core/modules/untar/main' include { JAFFAL } from '../../modules/local/jaffal' @@ -27,8 +31,4 @@ workflow RNA_FUSIONS_JAFFAL { */ JAFFAL( ch_jaffal_input, ch_jaffal_ref_dir ) -// emit: -// ch_nanopolish_outputs -// ch_dataprep_dirs -// nanopolish_version } diff --git a/subworkflows/local/rna_modifications_xpore_m6anet.nf b/subworkflows/local/rna_modifications_xpore_m6anet.nf index 239383b7..a0f1b777 100644 --- a/subworkflows/local/rna_modifications_xpore_m6anet.nf +++ b/subworkflows/local/rna_modifications_xpore_m6anet.nf @@ -1,3 +1,7 @@ +/* + * RNA MODIFICATION DETECTION WITH XPORE AND M6ANET + */ + include { NANOPOLISH_INDEX_EVENTALIGN } from '../../modules/local/nanopolish_index_eventalign' include { XPORE_DATAPREP } from '../../modules/local/xpore_dataprep' include { XPORE_DIFFMOD } from '../../modules/local/xpore_diffmod' From 7a56f9aa431606ee25d44bb1d4091ebe1d2435fc Mon Sep 17 00:00:00 2001 From: ekushele Date: Fri, 21 Jan 2022 08:18:22 +0200 Subject: [PATCH 064/169] fix changelog.md --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bb6b380c..637da02a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -9,7 +9,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set * Add `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq -======= + ## [3.0.0] - ? ### Major enhancements From 3aa9240fe3715b614b8c5ed703ba8dc58aa74d14 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Fri, 21 Jan 2022 14:38:15 +0800 Subject: [PATCH 065/169] address suggestions from Christopher --- CHANGELOG.md | 9 ++++++ CITATIONS.md | 9 ++++++ README.md | 2 ++ docs/output.md | 50 ++++++++++++++++++++++++++------ docs/usage.md | 2 +- modules/local/jaffal.nf | 10 +++++-- modules/local/m6anet_dataprep.nf | 6 ++++ modules/local/xpore_dataprep.nf | 6 ++++ 8 files changed, 81 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c881ae13..9bbd2948 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Major enhancements * Add DNA variant calling functionality +* Add RNA modification and fusion detection functionalities * Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Removed `--publish_dir_mode` as it is no longer required for the new syntax * Bump minimum Nextflow version from 21.04.0 -> 21.10.3 @@ -22,6 +23,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added `--phase_vcf` to output a phased vcf * Added `--skip_medaka` to skip `medaka_variant` * Added `--skip_sniffles` to skip `sniffles` +* Added `--skip_modification_analysis` to skip RNA modification detection +* Added `--skip_xpore` to skip `xpore` +* Added `--skip_m6anet` to skip `m6anet` +* Added `--skip_fusion_analysis` to skip RNA fusion detection +* Added `--jaffal_ref_dir` to indicate the reference directory path required by `JAFFAL` ### Software dependencies @@ -29,9 +35,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 |-------------------------|-------------|-------------| | `bioconductor-bambu` | 1.0.2 | 2.0.0 | | `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | +| `jaffa` | | 2.0 | +| `m6anet` | | 1.0 | | `medaka` | | 1.4.4 | | `multiqc` | 1.10.1 | 1.11 | | `sniffles` | | 1.0.12 | +| `xpore` | | 2.1 | ### Bug fix diff --git a/CITATIONS.md b/CITATIONS.md index 697c7f3c..0f046eef 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -23,6 +23,12 @@ * [Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis) +* [JAFFAL](https://doi.org/10.1186/s13059-021-02588-5) + > Davidson NM, et al., JAFFAL: detecting fusion genes with long-read transcriptome sequencing. Genome Biology (2022) + +* [m6anet](https://www.biorxiv.org/content/10.1101/2021.09.20.461055v1) + > Hendra C, et al., Detection of m6A from direct RNA sequencing using a Multiple Instance Learning framework. bioRXiv (2021) + * [Minimap2](https://pubmed.ncbi.nlm.nih.gov/29750242/) > Li H. Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics. 2018 Sep 15;34(18):3094-3100. doi: 10.1093/bioinformatics/bty191. PMID: 29750242; PMCID: PMC6137996. @@ -54,6 +60,9 @@ * [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. +* [xPore](https://doi.org/10.1038/s41587-021-00949-w) + > Pratanwanich PN, et al.,Identification of differential RNA modifications from nanopore direct RNA sequencing with xPore. Nat Biotechnol (2021) + ## R packages * [R](https://www.R-project.org/) diff --git a/README.md b/README.md index eb3510f8..a2676407 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,8 @@ On release, automated continuous integration tests run the pipeline on a [full-s * bambu performs both transcript reconstruction and quantification. * When StringTie2 is chosen, each sample can be processed individually and combined. After which, [`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/) will be used for both gene and transcript quantification. * Differential expression analysis ([`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html) and/or [`DEXSeq`](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html)) + * RNA modification detection ([`xpore`](https://github.com/GoekeLab/xpore) and/or [`m6anet`](https://github.com/GoekeLab/m6anet)) + * RNA fusion detection ([`JAFFAL`](https://github.com/Oshlack/JAFFA)) 9. Present QC for raw read and alignment results ([`MultiQC`](https://multiqc.info/docs/)) ## Quick Start diff --git a/docs/output.md b/docs/output.md index 2cf5c222..4710e42f 100644 --- a/docs/output.md +++ b/docs/output.md @@ -152,6 +152,24 @@ The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in a The creation of these files can be bypassed by setting the parameters `--skip_bigwig`/`--skip_bigbed`. +## Variant calling + +
+Output files + +* `minimap2/medaka//round_1.vcf` + VCF file with small variants for each sample. +* `minimap2/sniffles/_sniffles.vcf` + VCF files with unflitered structural variants. + +
+ +*Documentation*: +[Medaka](https://github.com/nanoporetech/medaka), [Sniffles](https://github.com/fritzsedlazeck/Sniffles) + +*Description*: +If the protocol is set to `--protocol DNA` and the *Minimap2* aligner was used, then the `--call_variants` parameter can be invoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. + ## Transcript Reconstruction and Quantification
@@ -191,8 +209,8 @@ After genomic alignment, novel transcripts can be reconstructed using tools such
Output files -* `/deseq2/deseq2.results.txt` - a `.txt` file that can contains differential expression results for genes. -* `/dexseq/dexseq.results.txt` - a `.txt` file that can contains differential expression results for transcripts. +* `/deseq2/deseq2.results.txt` - a `.txt` file that contains differential expression results for genes. +* `/dexseq/dexseq.results.txt` - a `.txt` file that contains differential expression results for transcripts.
@@ -202,23 +220,37 @@ After genomic alignment, novel transcripts can be reconstructed using tools such *Description*: If multiple conditions and multiple replicates are available then the pipeline is able to run differential analysis on gene and transcripts with DESeq2 and DEXSeq, respectively. These steps won't be run if you provide the `--skip_quantification` or `--skip_differential_analysis` parameters or if all of the samples in the samplesheet don't have the same fasta and GTF reference files. -## Variant calling +## RNA modification analysis
Output files -* `minimap2/medaka//round_1.vcf` - VCF file with small variants for each sample. -* `minimap2/sniffles/_sniffles.vcf` - VCF files with unflitered structural variants. +* `rna_modifications/xpore/diffmod/diffmod_outputs/diffmod.table` - a `.csv` file that contains differentially modified sites. +* `rna_modifications/m6anet/inference//data.result.csv.gz` - a `.csv` file that contains detected m6A sites.
*Documentation*: -[Medaka](https://github.com/nanoporetech/medaka), [Sniffles](https://github.com/fritzsedlazeck/Sniffles) +[xPore](https://xpore.readthedocs.io/en/latest/), [m6anet](https://m6anet.readthedocs.io/en/latest/) *Description*: -If the protocol is set to `--protocol DNA` and the *Minimap2* aligner was used, then the `--call_variants` parameter can be invoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. +If multiple conditions are available then the pipeline is able to run differential modification analysis with xPore. These steps won't be run if you provide the `--skip_modification_analysis` or `--skip_xpore` or `--skip_m6anet` parameters. + +## RNA fusion analysis + +
+Output files + +* `jaffal/jaffa_results.csv` - a `.csv` file that contains detected RNA fusion results. +* `jaffal/jaffa_results.fasta` - a `.fasta` file that contains the sequence of the detected RNA fusions. + +
+ +*Documentation*: +[jaffal](https://github.com/Oshlack/JAFFA/wiki) + +*Description*: +This step won't be run if you provide the `--skip_fusion_analysis` parameter. ## MultiQC diff --git a/docs/usage.md b/docs/usage.md index b33902cb..5d5ee107 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -13,7 +13,7 @@ You will need to create a file with information about the samples in your experi | `group` | Group identifier for sample. This will be identical for replicate samples from the same experimental group. | | `replicate` | Integer representing replicate number. Must start from `1..`. | | `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | -| `input_file` | Full path to FastQ file if previously demultiplexed or a BAM file if previously aligned. FastQ File has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam". | +| `input_file` | Full path to FastQ file if previously demultiplexed or a BAM file if previously aligned or a path to a directory with subdirectories `fastq` and `fast5` for RNA modification detection. FastQ File has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam". | | `genome` | Genome fasta file for alignment. This can either be blank, a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | | `transcriptome` | Transcriptome fasta/gtf file for alignment. This can either be blank or a local path. Must have the extension ".fasta", ".fasta.gz", ".fa", ".fa.gz", ".gtf" or ".gtf.gz". | diff --git a/modules/local/jaffal.nf b/modules/local/jaffal.nf index 47c51d5d..96905a03 100644 --- a/modules/local/jaffal.nf +++ b/modules/local/jaffal.nf @@ -7,7 +7,7 @@ process JAFFAL { container "docker.io/yuukiiwa/jaffa:2.0" //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? // 'https://depot.galaxyproject.org/singularity/jaffa:2.00--hdfd78af_1' : - // 'quay.io/biocontainers/jaffa:2.00--hdfd78af_1' }"//tried three biocontainers, all of them got command not found for minimap2 + // 'quay.io/biocontainers/jaffa:2.00--hdfd78af_1' }"//tried three biocontainers, all of them got command not found for minimap2 input: tuple val(meta), path(fastq) @@ -16,11 +16,15 @@ process JAFFAL { output: tuple val(meta), path("*.fasta") ,emit: jaffal_fastq path "*.csv" ,emit: jaffal_results - path "*_version.txt" ,emit: version + path "versions.yml" , emit: versions script: """ bpipe run -p refBase=$jaffal_ref_dir $jaffal_ref_dir/JAFFAL.groovy $fastq - echo 'jaffa 2.0' > jaffal_version.txt + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + jaffa: \$( echo 'jaffa 2.0' ) + END_VERSIONS """ } diff --git a/modules/local/m6anet_dataprep.nf b/modules/local/m6anet_dataprep.nf index fac6f257..89a493a3 100644 --- a/modules/local/m6anet_dataprep.nf +++ b/modules/local/m6anet_dataprep.nf @@ -10,6 +10,7 @@ process M6ANET_DATAPREP { output: tuple val(meta), path("$meta.id"), emit: dataprep_outputs + path "versions.yml" , emit: versions script: """ @@ -17,5 +18,10 @@ process M6ANET_DATAPREP { --eventalign $eventalign \\ --out_dir $meta.id \\ --n_processes $task.cpus + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + m6anet: \$( echo 'm6anet 1.0' ) + END_VERSIONS """ } diff --git a/modules/local/xpore_dataprep.nf b/modules/local/xpore_dataprep.nf index 7545bab5..9d3342a0 100644 --- a/modules/local/xpore_dataprep.nf +++ b/modules/local/xpore_dataprep.nf @@ -12,6 +12,7 @@ process XPORE_DATAPREP { output: tuple val(meta), path("$meta.id"), emit: dataprep_outputs + path "versions.yml" , emit: versions script: """ @@ -20,5 +21,10 @@ process XPORE_DATAPREP { --out_dir $meta.id \\ --n_processes $task.cpus \\ --genome --gtf_or_gff $gtf --transcript_fasta $genome + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + xpore: \$( xpore --version | sed -e 's/xpore version //g' ) + END_VERSIONS """ } From 105669a09367a2730e9b23fbb8340d917c66b7a9 Mon Sep 17 00:00:00 2001 From: ekushele Date: Sun, 23 Jan 2022 11:14:09 +0200 Subject: [PATCH 066/169] remove spaces --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 637da02a..0cb14ce9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Major enhancements -* Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set +* Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set * Add `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq ## [3.0.0] - ? From 72e458852b7c951bc5d9a90b0e38bfc7d8f86f21 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Mon, 24 Jan 2022 16:11:44 +0800 Subject: [PATCH 067/169] Update test.config --- conf/test.config | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/conf/test.config b/conf/test.config index 5321174c..9979fa4a 100644 --- a/conf/test.config +++ b/conf/test.config @@ -3,10 +3,8 @@ Nextflow config file for running minimal tests ======================================================================================== Defines input files and everything required to run a fast and simple pipeline test. - Use as follows: nextflow run nf-core/nanoseq -profile test, - ---------------------------------------------------------------------------------------- */ @@ -20,16 +18,15 @@ params { max_time = '6.h' // Input data to perform both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' - protocol = 'cDNA' - flowcell = 'FLO-MIN106' - kit = 'SQK-DCS109' - barcode_kit = 'EXP-NBD103' - run_nanolyse = true - skip_quantification = true - skip_fusion_analysis= true - skip_modification_analysis=true - + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' + protocol = 'cDNA' + flowcell = 'FLO-MIN106' + kit = 'SQK-DCS109' + barcode_kit = 'EXP-NBD103' + output_demultiplex_fast5 = true + run_nanolyse = true + skip_quantification = true + // This variable is just for reference and isnt actually required for the tests // Files are downloaded and staged using the "GetTestData" process input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/barcoded/' From 0bfb936c909da418b54c43e33834282127e7572b Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 24 Jan 2022 16:53:22 +0800 Subject: [PATCH 068/169] fix linting --- .Rhistory | 0 CHANGELOG.md | 9 +-- conf/modules.config | 2 +- conf/test.config | 4 +- modules/local/demux_fast5.nf | 57 ++++++++--------- modules/local/guppy.nf | 113 ++++++++++++++++---------------- nextflow_schema.json | 3 +- workflows/nanoseq.nf | 121 +++++++++++++++++------------------ 8 files changed, 150 insertions(+), 159 deletions(-) create mode 100644 .Rhistory diff --git a/.Rhistory b/.Rhistory new file mode 100644 index 00000000..e69de29b diff --git a/CHANGELOG.md b/CHANGELOG.md index 70db409b..fdc45bd7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,19 +3,14 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [3.0.1] - ? - -### Major enhancements - -* Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set -* Add `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq - ## [3.0.0] - ? ### Major enhancements * Add DNA variant calling functionality * Add RNA modification and fusion detection functionalities +* Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set +* Add `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq * Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Removed `--publish_dir_mode` as it is no longer required for the new syntax * Bump minimum Nextflow version from 21.04.0 -> 21.10.3 diff --git a/conf/modules.config b/conf/modules.config index 4c60ad16..16a2d1da 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -618,4 +618,4 @@ if (!params.skip_multiqc) { ] } } -} \ No newline at end of file +} diff --git a/conf/test.config b/conf/test.config index 9979fa4a..033eb59b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -23,9 +23,11 @@ params { flowcell = 'FLO-MIN106' kit = 'SQK-DCS109' barcode_kit = 'EXP-NBD103' - output_demultiplex_fast5 = true + output_demultiplex_fast5 = true run_nanolyse = true skip_quantification = true + skip_fusion_analysis = true + skip_modification_analysis=true // This variable is just for reference and isnt actually required for the tests // Files are downloaded and staged using the "GetTestData" process diff --git a/modules/local/demux_fast5.nf b/modules/local/demux_fast5.nf index a7c154da..59400ab6 100755 --- a/modules/local/demux_fast5.nf +++ b/modules/local/demux_fast5.nf @@ -1,35 +1,34 @@ process DEMUX_FAST5 { - label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process)) } + label 'process_medium' + publishDir "${params.outdir}", + mode: params.publish_dir_mode, + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process)) } - - conda (params.enable_conda ? "bioconda:ont-fast5-api:4.0.0--pyhdfd78af_0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/ont-fast5-api:4.0.0--pyhdfd78af_0" - } else { - container "quay.io/biocontainers/ont-fast5-api:4.0.0--pyhdfd78af_0" - } + conda (params.enable_conda ? "bioconda:ont-fast5-api:4.0.0--pyhdfd78af_0" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/ont-fast5-api:4.0.0--pyhdfd78af_0" + } else { + container "quay.io/biocontainers/ont-fast5-api:4.0.0--pyhdfd78af_0" + } - input: - path(input_path), stageAs: 'input_path/*' - tuple val(meta), path(input_summary) + input: + path(input_path), stageAs: 'input_path/*' + tuple val(meta), path(input_summary) - output: - path "demultiplexed_fast5/*" , emit: fast5 - path "versions.yml" , emit: versions + output: + path "demultiplexed_fast5/*" , emit: fast5 + path "versions.yml" , emit: versions - script: - """ - demux_fast5 \\ - --input input_path \\ - --save_path ./demultiplexed_fast5 \\ - --summary_file $input_summary - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - demux_fast5: \$(echo \$(python -c\'import ont_fast5_api;print(ont_fast5_api.__version__)\')) - END_VERSIONS - """ + script: + """ + demux_fast5 \\ + --input input_path \\ + --save_path ./demultiplexed_fast5 \\ + --summary_file $input_summary + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + demux_fast5: \$(echo \$(python -c\'import ont_fast5_api;print(ont_fast5_api.__version__)\')) + END_VERSIONS + """ } diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index 5dbf8a92..8878f4bd 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -1,65 +1,64 @@ process GUPPY { - label 'process_medium' + label 'process_medium' - if (params.guppy_gpu) { - container = 'genomicpariscentre/guppy-gpu:5.0.16' - clusterOptions = params.gpu_cluster_options - } else { - container = 'genomicpariscentre/guppy:5.0.16' - } + if (params.guppy_gpu) { + container = 'genomicpariscentre/guppy-gpu:5.0.16' + clusterOptions = params.gpu_cluster_options + } else { + container = 'genomicpariscentre/guppy:5.0.16' + } + input: + path(input_path), stageAs: 'input_path/*' + val meta + path guppy_config + path guppy_model - input: - path(input_path), stageAs: 'input_path/*' - val meta - path guppy_config - path guppy_model + output: + path "fastq/*.fastq.gz" , emit: fastq + tuple val(meta), path("basecalling/*.txt") , emit: summary + path "basecalling/*" , emit: called + path "versions.yml" , emit: versions - output: - path "fastq/*.fastq.gz" , emit: fastq - tuple val(meta), path("basecalling/*.txt") , emit: summary - path "basecalling/*" , emit: called - path "versions.yml" , emit: versions + script: + def trim_barcodes = params.trim_barcodes ? "--trim_barcodes" : "" + def barcode_kit = params.barcode_kit ? "--barcode_kits $params.barcode_kit" : "" + def barcode_ends = params.barcode_both_ends ? "--require_barcodes_both_ends" : "" + def proc_options = params.guppy_gpu ? "--device $params.gpu_device --num_callers $task.cpus --cpu_threads_per_caller $params.guppy_cpu_threads --gpu_runners_per_device $params.guppy_gpu_runners" : "--num_callers 2 --cpu_threads_per_caller ${task.cpus/2}" + def config = "--flowcell $params.flowcell --kit $params.kit" + if (params.guppy_config) config = file(params.guppy_config).exists() ? "--config ./$guppy_config" : "--config $params.guppy_config" + def model = "" + if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" + """ + guppy_basecaller \\ + --input_path input_path \\ + --save_path ./basecalling \\ + --records_per_fastq 0 \\ + --compress_fastq \\ + $barcode_kit \\ + $proc_options \\ + $barcode_ends \\ + $config \\ + $model + cat <<-END_VERSIONS > versions.yml + "${task.process}": + guppy: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') + END_VERSIONS - script: - def trim_barcodes = params.trim_barcodes ? "--trim_barcodes" : "" - def barcode_kit = params.barcode_kit ? "--barcode_kits $params.barcode_kit" : "" - def barcode_ends = params.barcode_both_ends ? "--require_barcodes_both_ends" : "" - def proc_options = params.guppy_gpu ? "--device $params.gpu_device --num_callers $task.cpus --cpu_threads_per_caller $params.guppy_cpu_threads --gpu_runners_per_device $params.guppy_gpu_runners" : "--num_callers 2 --cpu_threads_per_caller ${task.cpus/2}" - def config = "--flowcell $params.flowcell --kit $params.kit" - if (params.guppy_config) config = file(params.guppy_config).exists() ? "--config ./$guppy_config" : "--config $params.guppy_config" - def model = "" - if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" - """ - guppy_basecaller \\ - --input_path input_path \\ - --save_path ./basecalling \\ - --records_per_fastq 0 \\ - --compress_fastq \\ - $barcode_kit \\ - $proc_options \\ - $barcode_ends \\ - $config \\ - $model - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - guppy: \$(echo \$(guppy_basecaller --version 2>&1) | sed -r 's/.{81}//') - END_VERSIONS - - ## Concatenate fastq files - mkdir fastq - cd basecalling - if [ "\$(find . -type d -name "barcode*" )" != "" ] - then - for dir in pass/barcode*/ - do - dir=\$(basename \${dir%*/}) - cat pass/\$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz - done - else - cat *.fastq.gz > ../fastq/${meta.id}.fastq.gz - fi - """ + ## Concatenate fastq files + mkdir fastq + cd basecalling + if [ "\$(find . -type d -name "barcode*" )" != "" ] + then + for dir in pass/barcode*/ + do + dir=\$(basename \${dir%*/}) + cat pass/\$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz + done + else + cat *.fastq.gz > ../fastq/${meta.id}.fastq.gz + fi + """ } + diff --git a/nextflow_schema.json b/nextflow_schema.json index db49d62b..afc4df06 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -133,7 +133,7 @@ "description": "Cluster options required to use GPU resources (e.g. '--part=gpu --gres=gpu:1').", "fa_icon": "fas fa-fish" }, - "output_demultiplex_fast5": { + "output_demultiplex_fast5": { "type": "boolean", "description": "Output emultiplex fast5 files with demux_fast5.", "fa_icon": "fas fa-file-code" @@ -159,7 +159,6 @@ "description": "Skip demultiplexing with Guppy/qcat.", "fa_icon": "fas fa-fast-forward" }, - "run_nanolyse": { "type": "boolean", "description": "Filter reads from FastQ files using NanoLyse", diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 8fb2229c..b500a2f1 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -17,70 +17,70 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample // Function to check if running offline def isOffline() { - try { - return NXF_OFFLINE as Boolean - } - catch( Exception e ) { - return false - } + try { + return NXF_OFFLINE as Boolean + } + catch( Exception e ) { + return false + } } def ch_guppy_model = Channel.empty() def ch_guppy_config = Channel.empty() if (!params.skip_basecalling) { - // Need to stage guppy_config properly depending on whether its a file or string - if (!params.guppy_config) { - if (!params.flowcell) { exit 1, "Please specify a valid flowcell identifier for basecalling!" } - if (!params.kit) { exit 1, "Please specify a valid kit identifier for basecalling!" } - } else if (file(params.guppy_config).exists()) { - ch_guppy_config = Channel.fromPath(params.guppy_config) - } - - // Need to stage guppy_model properly depending on whether its a file or string - if (params.guppy_model) { - if (file(params.guppy_model).exists()) { - ch_guppy_model = Channel.fromPath(params.guppy_model) - } - } + // Need to stage guppy_config properly depending on whether its a file or string + if (!params.guppy_config) { + if (!params.flowcell) { exit 1, "Please specify a valid flowcell identifier for basecalling!" } + if (!params.kit) { exit 1, "Please specify a valid kit identifier for basecalling!" } + } else if (file(params.guppy_config).exists()) { + ch_guppy_config = Channel.fromPath(params.guppy_config) + } + + // Need to stage guppy_model properly depending on whether its a file or string + if (params.guppy_model) { + if (file(params.guppy_model).exists()) { + ch_guppy_model = Channel.fromPath(params.guppy_model) + } + } } else { - if (!params.skip_demultiplexing) { - if (!params.barcode_kit) { - params.barcode_kit = 'Auto' - } - - def qcatBarcodeKitList = ['Auto', 'RBK001', 'RBK004', 'NBD103/NBD104', - 'NBD114', 'NBD104/NBD114', 'PBC001', 'PBC096', - 'RPB004/RLB001', 'PBK004/LWB001', 'RAB204', 'VMK001', 'DUAL'] - - if (params.barcode_kit && qcatBarcodeKitList.contains(params.barcode_kit)) { - if (params.input_path) { - ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) - } else { - exit 1, "Please specify a valid input fastq file to perform demultiplexing!" - } - } else { - exit 1, "Please provide a barcode kit to demultiplex with qcat. Valid options: ${qcatBarcodeKitList}" - } - } + if (!params.skip_demultiplexing) { + if (!params.barcode_kit) { + params.barcode_kit = 'Auto' + } + + def qcatBarcodeKitList = ['Auto', 'RBK001', 'RBK004', 'NBD103/NBD104', + 'NBD114', 'NBD104/NBD114', 'PBC001', 'PBC096', + 'RPB004/RLB001', 'PBK004/LWB001', 'RAB204', 'VMK001', 'DUAL'] + + if (params.barcode_kit && qcatBarcodeKitList.contains(params.barcode_kit)) { + if (params.input_path) { + ch_input_path = Channel.fromPath(params.input_path, checkIfExists: true) + } else { + exit 1, "Please specify a valid input fastq file to perform demultiplexing!" + } + } else { + exit 1, "Please provide a barcode kit to demultiplex with qcat. Valid options: ${qcatBarcodeKitList}" + } + } } if (!params.skip_alignment) { - if (params.aligner != 'minimap2' && params.aligner != 'graphmap2') { - exit 1, "Invalid aligner option: ${params.aligner}. Valid options: 'minimap2', 'graphmap2'" - } - if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { - exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" - } + if (params.aligner != 'minimap2' && params.aligner != 'graphmap2') { + exit 1, "Invalid aligner option: ${params.aligner}. Valid options: 'minimap2', 'graphmap2'" + } + if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { + exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" + } } if (!params.skip_quantification) { - if (params.quantification_method != 'bambu' && params.quantification_method != 'stringtie2') { - exit 1, "Invalid transcript quantification option: ${params.quantification_method}. Valid options: 'bambu', 'stringtie2'" - } - if (params.protocol != 'cDNA' && params.protocol != 'directRNA') { - exit 1, "Invalid protocol option if performing quantification: ${params.protocol}. Valid options: 'cDNA', 'directRNA'" - } + if (params.quantification_method != 'bambu' && params.quantification_method != 'stringtie2') { + exit 1, "Invalid transcript quantification option: ${params.quantification_method}. Valid options: 'bambu', 'stringtie2'" + } + if (params.protocol != 'cDNA' && params.protocol != 'directRNA') { + exit 1, "Invalid protocol option if performing quantification: ${params.protocol}. Valid options: 'cDNA', 'directRNA'" + } } //////////////////////////////////////////////////// @@ -208,16 +208,13 @@ workflow NANOSEQ{ .join(ch_sample, by: 1) // join on barcode .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } .set { ch_fastq } - - if (params.output_demultiplex_fast5) { - - /* - * MODULE: Demultiplex fast5 files using ont_fast5_api/demux_fast5 - */ - DEMUX_FAST5 ( ch_input_path, ch_guppy_summary ) - ch_software_versions = ch_software_versions.mix(DEMUX_FAST5.out.versions.ifEmpty(null)) - } - + if (params.output_demultiplex_fast5) { + /* + * MODULE: Demultiplex fast5 files using ont_fast5_api/demux_fast5 + */ + DEMUX_FAST5 ( ch_input_path, ch_guppy_summary ) + ch_software_versions = ch_software_versions.mix(DEMUX_FAST5.out.versions.ifEmpty(null)) + } } else { ch_guppy_summary = Channel.empty() @@ -491,4 +488,4 @@ workflow.onComplete { //////////////////////////////////////////////////// /* -- THE END -- */ -//////////////////////////////////////////////////// \ No newline at end of file +//////////////////////////////////////////////////// From e8b7e815062a6615e031c9449572e4f9657eb883 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 24 Jan 2022 17:18:08 +0800 Subject: [PATCH 069/169] fix --- .Rhistory | 0 conf/test.config | 19 ++++++++++--------- modules/local/guppy.nf | 8 ++++---- 3 files changed, 14 insertions(+), 13 deletions(-) delete mode 100644 .Rhistory diff --git a/.Rhistory b/.Rhistory deleted file mode 100644 index e69de29b..00000000 diff --git a/conf/test.config b/conf/test.config index 033eb59b..f442bc9b 100644 --- a/conf/test.config +++ b/conf/test.config @@ -18,18 +18,19 @@ params { max_time = '6.h' // Input data to perform both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' - protocol = 'cDNA' - flowcell = 'FLO-MIN106' - kit = 'SQK-DCS109' - barcode_kit = 'EXP-NBD103' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' + protocol = 'cDNA' + flowcell = 'FLO-MIN106' + kit = 'SQK-DCS109' + barcode_kit = 'EXP-NBD103' output_demultiplex_fast5 = true - run_nanolyse = true - skip_quantification = true - skip_fusion_analysis = true + run_nanolyse = true + skip_quantification = true + skip_fusion_analysis= true skip_modification_analysis=true - + // This variable is just for reference and isnt actually required for the tests // Files are downloaded and staged using the "GetTestData" process input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/barcoded/' } + diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index 8878f4bd..eb3c5552 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -50,11 +50,11 @@ process GUPPY { mkdir fastq cd basecalling if [ "\$(find . -type d -name "barcode*" )" != "" ] - then - for dir in pass/barcode*/ + then + for dir in barcode*/ do - dir=\$(basename \${dir%*/}) - cat pass/\$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz + dir=\${dir%*/} + cat \$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz done else cat *.fastq.gz > ../fastq/${meta.id}.fastq.gz From 6f17857099d793b0bfa88109b057528a7c57cd7c Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 24 Jan 2022 17:34:10 +0800 Subject: [PATCH 070/169] use 4.0.14 guppy --- conf/test.config | 3 ++- modules/local/guppy.nf | 22 +++++++++++----------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/conf/test.config b/conf/test.config index f442bc9b..31773c28 100644 --- a/conf/test.config +++ b/conf/test.config @@ -3,8 +3,10 @@ Nextflow config file for running minimal tests ======================================================================================== Defines input files and everything required to run a fast and simple pipeline test. + Use as follows: nextflow run nf-core/nanoseq -profile test, + ---------------------------------------------------------------------------------------- */ @@ -33,4 +35,3 @@ params { // Files are downloaded and staged using the "GetTestData" process input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fast5/barcoded/' } - diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index eb3c5552..c4ab1f9d 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -2,10 +2,10 @@ process GUPPY { label 'process_medium' if (params.guppy_gpu) { - container = 'genomicpariscentre/guppy-gpu:5.0.16' + container = 'genomicpariscentre/guppy-gpu:4.0.14' clusterOptions = params.gpu_cluster_options } else { - container = 'genomicpariscentre/guppy:5.0.16' + container = 'genomicpariscentre/guppy:4.0.14' } input: @@ -31,15 +31,15 @@ process GUPPY { if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" """ guppy_basecaller \\ - --input_path input_path \\ - --save_path ./basecalling \\ - --records_per_fastq 0 \\ - --compress_fastq \\ - $barcode_kit \\ - $proc_options \\ - $barcode_ends \\ - $config \\ - $model + --input_path input_path \\ + --save_path ./basecalling \\ + --records_per_fastq 0 \\ + --compress_fastq \\ + $barcode_kit \\ + $proc_options \\ + $barcode_ends \\ + $config \\ + $model cat <<-END_VERSIONS > versions.yml "${task.process}": From 2a2ec2e61f5df6d07c7686d21faf5a8f4067c42b Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Mon, 24 Jan 2022 12:48:57 +0100 Subject: [PATCH 071/169] Add cuteSV and move to subworkflows --- CHANGELOG.md | 7 +++- conf/modules.config | 4 +- nextflow.config | 6 ++- nextflow_schema.json | 28 +++++++++---- .../local/structural_variant_calling.nf | 42 +++++++++++++++++++ ..._variant_calling.nf => variant_calling.nf} | 22 ++-------- workflows/nanoseq.nf | 37 +++++++++++++--- 7 files changed, 108 insertions(+), 38 deletions(-) create mode 100644 subworkflows/local/structural_variant_calling.nf rename subworkflows/local/{dna_variant_calling.nf => variant_calling.nf} (77%) diff --git a/CHANGELOG.md b/CHANGELOG.md index 9bbd2948..5dc4d8da 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,8 +21,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Added `--call_variants` to detect DNA variants * Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms * Added `--phase_vcf` to output a phased vcf -* Added `--skip_medaka` to skip `medaka_variant` -* Added `--skip_sniffles` to skip `sniffles` +* Added `--skip_vc` to skip `variant_calling` +* Added `--skip_sv` to skip `structural_variant_calling` +* Added `--variant_caller` to specify variant caller. +* Added `--structural_variant_caller` to specify structural variant caller * Added `--skip_modification_analysis` to skip RNA modification detection * Added `--skip_xpore` to skip `xpore` * Added `--skip_m6anet` to skip `m6anet` @@ -35,6 +37,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 |-------------------------|-------------|-------------| | `bioconductor-bambu` | 1.0.2 | 2.0.0 | | `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | +| `cutesv` | | 1.0.12 | | `jaffa` | | 2.0 | | `m6anet` | | 1.0 | | `medaka` | | 1.4.4 | diff --git a/conf/modules.config b/conf/modules.config index 3693dee0..dd7f66af 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -405,7 +405,7 @@ if (!params.skip_alignment) { } if (params.call_variants) { - if (!params.skip_medaka) { + if (params.variant_caller == 'medaka') { process { withName: MEDAKA_VARIANT { publishDir = [ @@ -417,7 +417,7 @@ if (params.call_variants) { } } } - if (!params.skip_sniffles) { + if (params.structural_variant_caller == 'sniffles') { process { withName: SNIFFLES { publishDir = [ diff --git a/nextflow.config b/nextflow.config index 57f69ca7..164afb92 100644 --- a/nextflow.config +++ b/nextflow.config @@ -43,10 +43,12 @@ params { // Options: DNA variant calling call_variants = false + variant_caller = 'medaka' + structural_variant_caller = 'sniffles' split_mnps = false phase_vcf = false - skip_medaka = false - skip_sniffles = false + skip_vc = false + skip_sv = false // Options: Visualisation skip_bigbed = false diff --git a/nextflow_schema.json b/nextflow_schema.json index 3031765a..3d21c132 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -192,8 +192,8 @@ } } }, - "dna_variant_calling_options": { - "title": "DNA variant calling options", + "variant_calling_options": { + "title": "Variant calling options", "type": "object", "description": "Options to adjust pameters and filtering criteria for DNA varinat calling.", "default": "", @@ -201,9 +201,21 @@ "properties": { "call_variants": { "type": "boolean", - "description": "Specifies if variants will be called.", + "description": "Specifies if variant calling will executed.", "fa_icon": "fas fa-exchange-alt" }, + "variant_caller": { + "type": "string", + "default": "medaka", + "description": "Specifies the variant caller to be used to call small variants (available are: medaka). Only available '--call_variants' is set and the protocol is DNA.", + "fa_icon": "fas fa-bezier-curve" + }, + "structural_variant_caller": { + "type": "string", + "default": "sniffles", + "description": "Specifies the variant caller to be used to call structural variants (available are: sniffles and cutesv). Only available '--call_variants' is set and the protocol is DNA.", + "fa_icon": "fas fa-bezier-curve" + }, "split_mnps": { "type": "boolean", "description": "Specifies if MNPs will be split into SNPs.", @@ -214,15 +226,15 @@ "fa_icon": "fas fa-exchange-alt", "description": "Specifies if vcf will be phased." }, - "skip_medaka": { + "skip_vc": { "type": "boolean", "fa_icon": "fas fa-fast-forward", - "description": "Skip variant calling with sniffles." + "description": "Skip variant calling." }, - "skip_sniffles": { + "skip_sv": { "type": "boolean", "fa_icon": "fas fa-fast-forward", - "description": "Skip variant calling with sniffles." + "description": "Skip structural variant calling." } } }, @@ -532,7 +544,7 @@ "$ref": "#/definitions/alignment_options" }, { - "$ref": "#/definitions/dna_variant_calling_options" + "$ref": "#/definitions/variant_calling_options" }, { "$ref": "#/definitions/differential_analysis_options" diff --git a/subworkflows/local/structural_variant_calling.nf b/subworkflows/local/structural_variant_calling.nf new file mode 100644 index 00000000..094f5165 --- /dev/null +++ b/subworkflows/local/structural_variant_calling.nf @@ -0,0 +1,42 @@ +/* + * Structural variant calling + */ + +include { SNIFFLES } from '../../modules/local/sniffles' +include { CUTESV } from '../../modules/local/cutesv' + +workflow STRUCTURAL_VARIANT_CALLING { + + main: + take: + ch_view_sortbam + ch_index + + main: + ch_sv_calls = Channel.empty() + sniffles_version = Channel.empty() + cutesv_version = Channel.empty() + if (params.structural_variant_caller == 'sniffles'){ + /* + * Call structural variants with SNIFFLES + */ + SNIFFLES( ch_view_sortbam ) + ch_sv_calls = SNIFFLES.out.sv_calls + sniffles_version = SNIFFLES.out.versions + + } else { + /* + * Call structural variants with cuteSV + */ + CUTESV( ch_view_sortbam, ch_index ) + ch_sv_calls = CUTESV.out.sv_calls + cutesv_version = CUTESV.out.versions + + } + + emit: + ch_sv_calls + sniffles_version + cutesv_version + +} diff --git a/subworkflows/local/dna_variant_calling.nf b/subworkflows/local/variant_calling.nf similarity index 77% rename from subworkflows/local/dna_variant_calling.nf rename to subworkflows/local/variant_calling.nf index 66901d53..6d5958ce 100644 --- a/subworkflows/local/dna_variant_calling.nf +++ b/subworkflows/local/variant_calling.nf @@ -1,24 +1,22 @@ /* - * DNA variant calling + * Variant calling */ include { MEDAKA_VARIANT } from '../../modules/local/medaka_variant' include { SNIFFLES } from '../../modules/local/sniffles' //include { CUTESV } from '../../modules/local/cutesv' -workflow DNA_VARIANT_CALLING { +workflow VARIANT_CALLING { main: take: ch_view_sortbam ch_index - skip_medaka - skip_sniffles main: ch_variant_calls = Channel.empty() medaka_version = Channel.empty() - if (!skip_medaka){ + if (params.variant_caller == 'medaka'){ /* * Split into a different channel for each chromosome */ @@ -43,23 +41,9 @@ workflow DNA_VARIANT_CALLING { } ch_sv_calls = Channel.empty() sniffles_version = Channel.empty() - if (!skip_sniffles){ - /* - * Call structural variants - */ - SNIFFLES( ch_view_sortbam ) - ch_sv_calls = SNIFFLES.out.sv_calls - sniffles_version = SNIFFLES.out.versions - - } else{ - } emit: ch_variant_calls medaka_version - ch_sv_calls - sniffles_version - - } diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index adcad654..ebe78cbe 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -74,6 +74,23 @@ if (!params.skip_alignment) { } } +if (params.call_variants) { + if (params.protocol != 'DNA') { + exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA'" + } + if (!params.skip_vc && params.variant_caller != 'medaka') { + exit 1, "Invalid variant caller option: ${params.variant_caller}. Valid options: 'medaka'" + } + if (!params.skip_sv && params.structural_variant_caller != 'sniffles' && params.structural_variant_caller != 'cutesv') { + exit 1, "Invalid structural variant caller option: ${params.structural_variant_caller}. Valid options: 'sniffles', 'cutesv" + } +} + + if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { + exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" + } + + if (!params.skip_quantification) { if (params.quantification_method != 'bambu' && params.quantification_method != 'stringtie2') { exit 1, "Invalid transcript quantification option: ${params.quantification_method}. Valid options: 'bambu', 'stringtie2'" @@ -113,7 +130,8 @@ include { QCFASTQ_NANOPLOT_FASTQC } from '../subworkflows/local/qcfastq include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' include { BAM_SORT_INDEX_SAMTOOLS } from '../subworkflows/local/bam_sort_index_samtools' -include { DNA_VARIANT_CALLING } from '../subworkflows/local/dna_variant_calling' +include { VARIANT_CALLING } from '../subworkflows/local/variant_calling' +include { STRUCTURAL_VARIANT_CALLING } from '../subworkflows/local/structural_variant_calling' include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtools_ucsc_bigwig' include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' include { QUANTIFY_STRINGTIE_FEATURECOUNTS } from '../subworkflows/local/quantify_stringtie_featurecounts' @@ -325,11 +343,20 @@ workflow NANOSEQ{ if (params.call_variants && params.protocol == 'DNA') { /* - * SUBWORKFLOW: DNA variant calling + * SUBWORKFLOW: Variant calling */ - DNA_VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] }, params.skip_medaka, params.skip_sniffles ) - ch_software_versions = ch_software_versions.mix(DNA_VARIANT_CALLING.out.sniffles_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(DNA_VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) + if(!params.skip_vc) { + VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] } ) + ch_software_versions = ch_software_versions.mix(VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) + } + /* + * SUBWORKFLOW: Structural variant calling + */ + if(!params.skip_sv) { + STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] } ) + ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.sniffles_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.cutesv_version.first().ifEmpty(null)) + } } ch_bedtools_version = Channel.empty() From cc28b5a355210bef35ec3d62cdeee4ba0b86f2fa Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Tue, 25 Jan 2022 12:21:42 +0800 Subject: [PATCH 072/169] guppy 5.0.16 is working --- conf/test.config | 1 + modules/local/demux_fast5.nf | 5 +---- modules/local/guppy.nf | 13 +++++++------ 3 files changed, 9 insertions(+), 10 deletions(-) mode change 100755 => 100644 modules/local/demux_fast5.nf diff --git a/conf/test.config b/conf/test.config index 31773c28..397f1916 100644 --- a/conf/test.config +++ b/conf/test.config @@ -25,6 +25,7 @@ params { flowcell = 'FLO-MIN106' kit = 'SQK-DCS109' barcode_kit = 'EXP-NBD103' + trim_barcodes=true output_demultiplex_fast5 = true run_nanolyse = true skip_quantification = true diff --git a/modules/local/demux_fast5.nf b/modules/local/demux_fast5.nf old mode 100755 new mode 100644 index 59400ab6..f121f89c --- a/modules/local/demux_fast5.nf +++ b/modules/local/demux_fast5.nf @@ -1,8 +1,5 @@ process DEMUX_FAST5 { label 'process_medium' - publishDir "${params.outdir}", - mode: params.publish_dir_mode, - saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process)) } conda (params.enable_conda ? "bioconda:ont-fast5-api:4.0.0--pyhdfd78af_0" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { @@ -28,7 +25,7 @@ process DEMUX_FAST5 { cat <<-END_VERSIONS > versions.yml "${task.process}": - demux_fast5: \$(echo \$(python -c\'import ont_fast5_api;print(ont_fast5_api.__version__)\')) + demux_fast5: \$(python -c 'import ont_fast5_api;print(ont_fast5_api.__version__)') END_VERSIONS """ } diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index c4ab1f9d..3bd3921e 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -2,10 +2,10 @@ process GUPPY { label 'process_medium' if (params.guppy_gpu) { - container = 'genomicpariscentre/guppy-gpu:4.0.14' + container = 'genomicpariscentre/guppy-gpu:5.0.16' clusterOptions = params.gpu_cluster_options } else { - container = 'genomicpariscentre/guppy:4.0.14' + container = 'genomicpariscentre/guppy:5.0.16' } input: @@ -36,6 +36,7 @@ process GUPPY { --records_per_fastq 0 \\ --compress_fastq \\ $barcode_kit \\ + $trim_barcodes \\ $proc_options \\ $barcode_ends \\ $config \\ @@ -51,13 +52,13 @@ process GUPPY { cd basecalling if [ "\$(find . -type d -name "barcode*" )" != "" ] then - for dir in barcode*/ + for dir in pass/barcode*/ do - dir=\${dir%*/} - cat \$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz + dir=\$(basename \${dir%*/}) + cat pass/\$dir/*.fastq.gz > ../fastq/\$dir.fastq.gz done else - cat *.fastq.gz > ../fastq/${meta.id}.fastq.gz + cat pass/*.fastq.gz > ../fastq/${meta.id}.fastq.gz fi """ } From a3df04d3764fc1d0eea63edb8d520636d3b52eb3 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Tue, 25 Jan 2022 12:39:32 +0800 Subject: [PATCH 073/169] update CHANGELOG --- CHANGELOG.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fdc45bd7..33cb7a3f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,7 +10,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 * Add DNA variant calling functionality * Add RNA modification and fusion detection functionalities * Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set -* Add `--trim_barcodes` in Guppy basecaller to trim the barcodes fromm output fastq +* Add `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq * Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules * Removed `--publish_dir_mode` as it is no longer required for the new syntax * Bump minimum Nextflow version from 21.04.0 -> 21.10.3 @@ -20,6 +20,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameters +* Added `--output_demultiplex_fast5` to output demultiplexed fast5 +* Added `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq * Added `--call_variants` to detect DNA variants * Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms * Added `--phase_vcf` to output a phased vcf @@ -37,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 |-------------------------|-------------|-------------| | `bioconductor-bambu` | 1.0.2 | 2.0.0 | | `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | +| `guppy` | 4.0.14 | 5.0.16 | | `jaffa` | | 2.0 | | `m6anet` | | 1.0 | | `medaka` | | 1.4.4 | From ddd585f75f552c579fca0e3611e4d6ceb76d0bdf Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Tue, 25 Jan 2022 21:49:46 +0800 Subject: [PATCH 074/169] add ont_fast5_api --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 33cb7a3f..3fe6399d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -44,6 +44,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `m6anet` | | 1.0 | | `medaka` | | 1.4.4 | | `multiqc` | 1.10.1 | 1.11 | +| `ont_fast5_api` | | 4.0.0 | | `sniffles` | | 1.0.12 | | `xpore` | | 2.1 | From 6b6db50da009e6fb0824eb009cfb523ca6873459 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Wed, 26 Jan 2022 16:49:49 +0800 Subject: [PATCH 075/169] fix command line error --- modules/local/guppy.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/guppy.nf b/modules/local/guppy.nf index 3bd3921e..fc080e49 100644 --- a/modules/local/guppy.nf +++ b/modules/local/guppy.nf @@ -21,6 +21,7 @@ process GUPPY { path "versions.yml" , emit: versions script: + def fast5_dir_path = workflow.profile.contains('test') ? "input_path" : "$input_path" def trim_barcodes = params.trim_barcodes ? "--trim_barcodes" : "" def barcode_kit = params.barcode_kit ? "--barcode_kits $params.barcode_kit" : "" def barcode_ends = params.barcode_both_ends ? "--require_barcodes_both_ends" : "" @@ -31,7 +32,7 @@ process GUPPY { if (params.guppy_model) model = file(params.guppy_model).exists() ? "--model ./$guppy_model" : "--model $params.guppy_model" """ guppy_basecaller \\ - --input_path input_path \\ + --input_path $fast5_dir_path \\ --save_path ./basecalling \\ --records_per_fastq 0 \\ --compress_fastq \\ From f3a2b34efee0799a2676bc2372637c4841b7d7fd Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Wed, 26 Jan 2022 17:55:02 +0800 Subject: [PATCH 076/169] Update test_full.config --- conf/test_full.config | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/conf/test_full.config b/conf/test_full.config index 52ce3ec1..1ce10a6a 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -11,12 +11,14 @@ */ params { - config_profile_name = 'Full test profile' - config_profile_description = 'Full test dataset to check pipeline function' + config_profile_name = 'Full test profile' + config_profile_description = 'Full test dataset to check pipeline function' - // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_full.csv' - protocol = 'cDNA' - skip_basecalling = true - skip_demultiplexing = true -} \ No newline at end of file + // Input data for full size test + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_full.csv' + protocol = 'cDNA' + skip_basecalling = true + skip_demultiplexing = true + skip_fusion_analysis= true + skip_modification_analysis=true +} From 7112815e9830425dde6bf3b98838b271d664e909 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Wed, 26 Jan 2022 21:48:29 +0800 Subject: [PATCH 077/169] update fast5_dir_path --- modules/local/demux_fast5.nf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/local/demux_fast5.nf b/modules/local/demux_fast5.nf index f121f89c..88903a21 100644 --- a/modules/local/demux_fast5.nf +++ b/modules/local/demux_fast5.nf @@ -17,9 +17,10 @@ process DEMUX_FAST5 { path "versions.yml" , emit: versions script: + def fast5_dir_path = workflow.profile.contains('test') ? "input_path" : "$input_path" """ demux_fast5 \\ - --input input_path \\ + --input $fast5_dir_path \\ --save_path ./demultiplexed_fast5 \\ --summary_file $input_summary From f2965e5914cd119e50a4c91b0b4941d517cac047 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 13:43:50 +0100 Subject: [PATCH 078/169] Add subway map Added svg nanoseq sumary --- docs/images/nanoseq_subwaymap_v3.0.svg | 1596 ++++++++++++++++++++++++ 1 file changed, 1596 insertions(+) create mode 100644 docs/images/nanoseq_subwaymap_v3.0.svg diff --git a/docs/images/nanoseq_subwaymap_v3.0.svg b/docs/images/nanoseq_subwaymap_v3.0.svg new file mode 100644 index 00000000..6f6f949d --- /dev/null +++ b/docs/images/nanoseq_subwaymap_v3.0.svg @@ -0,0 +1,1596 @@ + +image/svg+xmlguppynanolyseONT fast5 apipycoqcnanoplotqcatfastqcnanoplot+nanopolishxporem6anetstringtie2snifflesmedakadirect RNA (align to transcriptome)direct RNA + cDNA (align to genome)DNAProtocolsbambuDESeq2samtoolsDEXSeqfast5fast5fastqfastqbamJAFFALminimap2graphmap2nf-core/nanoseq Nanopore demultiplexing, QC, alignment, and variant detection workflow From 30aadf4aa442f2ff2bcf7452866ef0fa4ed6802a Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 16:06:13 +0100 Subject: [PATCH 079/169] Add files via upload Added subway png --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 0 -> 134251 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/nanoseq_subwaymap_v3.0.png diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png new file mode 100644 index 0000000000000000000000000000000000000000..32c6691fe3617b7b07bd05cbbd01ac01c5e53e64 GIT binary patch literal 134251 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 literal 0 HcmV?d00001 From 5e0031082863a86a4fdd9f760ca2d3794e5118de Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 16:14:08 +0100 Subject: [PATCH 080/169] Update README.md Add subway map image --- README.md | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index da24dc23..7e8a1205 100644 --- a/README.md +++ b/README.md @@ -17,17 +17,10 @@ ## Introduction -**nfcore/nanoseq** is a bioinformatics analysis pipeline for Nanopore DNA/RNA sequencing data that can be used to perform basecalling, demultiplexing, QC, mapping and downstream analysis. +**nfcore/nanoseq** is a bioinformatics analysis pipeline for Nanopore DNA/RNA sequencing data that can be used to perform basecalling, demultiplexing, QC, alignment, and downstream analysis. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! -On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/nanoseq/results). - -## Pipeline summary - -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) - On release, automated continuous integration tests run the pipeline on a [full-sized dataset](https://github.com/nf-core/test-datasets/tree/nanoseq#full-sized-test-data) obtained from the [Singapore Nanopore Expression Consortium](https://github.com/GoekeLab/sg-nex-data) on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/nanoseq/results). ## Pipeline Summary @@ -52,6 +45,15 @@ On release, automated continuous integration tests run the pipeline on a [full-s * RNA fusion detection ([`JAFFAL`](https://github.com/Oshlack/JAFFA)) 9. Present QC for raw read and alignment results ([`MultiQC`](https://multiqc.info/docs/)) +#### Functionality Overview + +A graphical overview of suggested routes through the pipeline depending on context can be seen below. + +

+ nf-core/nanoseq metro map + + ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) From 05f2b8c8d37b0beea940664768d235e6ca70bc23 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 16:21:08 +0100 Subject: [PATCH 081/169] Delete nanoseq_subwaymap_v3.0.png Out of date --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 134251 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/nanoseq_subwaymap_v3.0.png diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png deleted file mode 100644 index 32c6691fe3617b7b07bd05cbbd01ac01c5e53e64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134251 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 From 40e902a929ee87dd4b96e9382c8c15810da6546f Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 16:21:23 +0100 Subject: [PATCH 082/169] Delete nanoseq_subwaymap_v3.0.svg Out of date --- docs/images/nanoseq_subwaymap_v3.0.svg | 1596 ------------------------ 1 file changed, 1596 deletions(-) delete mode 100644 docs/images/nanoseq_subwaymap_v3.0.svg diff --git a/docs/images/nanoseq_subwaymap_v3.0.svg b/docs/images/nanoseq_subwaymap_v3.0.svg deleted file mode 100644 index 6f6f949d..00000000 --- a/docs/images/nanoseq_subwaymap_v3.0.svg +++ /dev/null @@ -1,1596 +0,0 @@ - -image/svg+xmlguppynanolyseONT fast5 apipycoqcnanoplotqcatfastqcnanoplot+nanopolishxporem6anetstringtie2snifflesmedakadirect RNA (align to transcriptome)direct RNA + cDNA (align to genome)DNAProtocolsbambuDESeq2samtoolsDEXSeqfast5fast5fastqfastqbamJAFFALminimap2graphmap2nf-core/nanoseq Nanopore demultiplexing, QC, alignment, and variant detection workflow From 14b4f337e4a77dea86d1e883c3911da08ac2f898 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 16:22:14 +0100 Subject: [PATCH 083/169] Add files via upload Fixed versions of subway map --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 0 -> 135282 bytes docs/images/nanoseq_subwaymap_v3.0.svg | 964 +++++++++++++++++++++++++ 2 files changed, 964 insertions(+) create mode 100644 docs/images/nanoseq_subwaymap_v3.0.png create mode 100644 docs/images/nanoseq_subwaymap_v3.0.svg diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png new file mode 100644 index 0000000000000000000000000000000000000000..3e6985877fcdbf2ed76146756adfbec7ab69c79b GIT binary patch literal 135282 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 >=0t%08ssTHr$eNDC2WBKcC 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ࡻlmbvfCB61+BF>U+L$T!lQ4P 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 literal 0 HcmV?d00001 diff --git a/docs/images/nanoseq_subwaymap_v3.0.svg b/docs/images/nanoseq_subwaymap_v3.0.svg new file mode 100644 index 00000000..d0bb36e6 --- /dev/null +++ b/docs/images/nanoseq_subwaymap_v3.0.svg @@ -0,0 +1,964 @@ + +image/svg+xmlguppynanolyseONT fast5 apipycoqcnanoplotqcatfastqcnanoplot+nanopolishxporem6anetstringtie2snifflesmedakadirect RNA (align to transcriptome)direct RNA + cDNA (align to genome)DNAProtocolsbambuDESeq2samtoolsDEXSeqfast5fastqfastqbamJAFFALminimap2graphmap2nf-core/nanoseq Nanopore basecalling, demultiplexing, QC, alignment, and downstram analysis.fast5 From 987c4a383091bec39f143626880b7c14b2e24d3a Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 16:23:25 +0100 Subject: [PATCH 084/169] Update README.md Increase image, change heading size --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 7e8a1205..0d8e4ef8 100644 --- a/README.md +++ b/README.md @@ -45,12 +45,12 @@ On release, automated continuous integration tests run the pipeline on a [full-s * RNA fusion detection ([`JAFFAL`](https://github.com/Oshlack/JAFFA)) 9. Present QC for raw read and alignment results ([`MultiQC`](https://multiqc.info/docs/)) -#### Functionality Overview +### Functionality Overview -A graphical overview of suggested routes through the pipeline depending on context can be seen below. +A graphical overview of suggested routes through the pipeline depending on the desired output can be seen below.

- nf-core/nanoseq metro map From bee3f3fa07f1082ec22c2de34825f499c7d915a2 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 2 Feb 2022 16:26:28 +0100 Subject: [PATCH 085/169] Update README.md Fix lint --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 0d8e4ef8..cc8e77ea 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,6 @@ A graphical overview of suggested routes through the pipeline depending on the d nf-core/nanoseq metro map - ## Quick Start 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) From 21c9430d24346f2be7a7fcc97ef0b7a454fc7b35 Mon Sep 17 00:00:00 2001 From: yuukiiwa Date: Thu, 3 Feb 2022 13:51:23 +0800 Subject: [PATCH 086/169] address suggestions from Chris --- docs/output.md | 6 +++--- docs/usage.md | 2 +- nextflow_schema.json | 4 ++-- subworkflows/local/bam_sort_index_samtools.nf | 4 ++-- subworkflows/local/dna_variant_calling.nf | 6 ++++++ subworkflows/local/rna_fusions_jaffal.nf | 1 - workflows/nanoseq.nf | 4 ++-- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/docs/output.md b/docs/output.md index ebc191db..df54df57 100644 --- a/docs/output.md +++ b/docs/output.md @@ -43,14 +43,14 @@ The directories listed below will be created in the output directory after the p

*Documentation*: -[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux_fasat5](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) +[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux_fast5](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) *Description*: The pipeline has been written to deal with the various scenarios where you would like to include/exclude the basecalling and demultiplexing steps. This will be dependent on what type of input data you would like to provide the pipeline. Additionally, if you would like to align your samples to a reference genome there are various options for providing this information. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet, associated commands and how to provide reference genome data. *Guppy* will be used to basecall and demultiplex the data. Various options have been provided to customise specific parameters and to be able to run *Guppy* on GPUs. -*demux_fasat5* will demultiplex the fast5 files, gives the *Guppy* summary file. +*demux_fast5* will demultiplex the fast5 files, gives the *Guppy* summary file. If you have a pre-basecalled fastq file then *qcat* will be used to perform the demultiplexing if you provide the `--skip_basecalling` parameter. If you would like to skip both of these steps entirely then you can provide `--skip_basecalling --skip_demultiplexing` when running the pipeline. As a result, the structure of the output folder will depend on which steps you have chosen to run in the pipeline. @@ -165,7 +165,7 @@ The creation of these files can be bypassed by setting the parameters `--skip_bi * `minimap2/medaka//round_1.vcf` VCF file with small variants for each sample. -* `minimap2/sniffles/_sniffles.vcf` +* `minimap2/sniffles/_sniffles.vcf` VCF files with unflitered structural variants.
diff --git a/docs/usage.md b/docs/usage.md index 5d5ee107..e8e8cceb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -13,7 +13,7 @@ You will need to create a file with information about the samples in your experi | `group` | Group identifier for sample. This will be identical for replicate samples from the same experimental group. | | `replicate` | Integer representing replicate number. Must start from `1..`. | | `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | -| `input_file` | Full path to FastQ file if previously demultiplexed or a BAM file if previously aligned or a path to a directory with subdirectories `fastq` and `fast5` for RNA modification detection. FastQ File has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam". | +| `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam" | | `genome` | Genome fasta file for alignment. This can either be blank, a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | | `transcriptome` | Transcriptome fasta/gtf file for alignment. This can either be blank or a local path. Must have the extension ".fasta", ".fasta.gz", ".fa", ".fa.gz", ".gtf" or ".gtf.gz". | diff --git a/nextflow_schema.json b/nextflow_schema.json index afc4df06..9a39f843 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -91,7 +91,7 @@ "trim_barcodes": { "type": "boolean", "fa_icon": "fas fa-barcode", - "description": "Wether to trim the barcodes from the output sequences in the FastQ files from Guppy basecaller." + "description": "Whether to trim the barcodes from the output sequences in the FastQ files from Guppy basecaller." }, "guppy_config": { "type": "string", @@ -135,7 +135,7 @@ }, "output_demultiplex_fast5": { "type": "boolean", - "description": "Output emultiplex fast5 files with demux_fast5.", + "description": "Demultiplex fast5 files with demux_fast5.", "fa_icon": "fas fa-file-code" }, "qcat_min_score": { diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index 9971a86a..2b7f5b0d 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -38,10 +38,10 @@ workflow BAM_SORT_INDEX_SAMTOOLS { .join ( BAM_STATS_SAMTOOLS.out.flagstat ) .map { it -> [ it[1], it[2], it[3] ] } .set { sortbam_stats_multiqc } - versions = BAM_STATS_SAMTOOLS.out.versions + samtools_versions = BAM_STATS_SAMTOOLS.out.versions emit: sortbam sortbam_stats_multiqc - versions + samtools_versions } diff --git a/subworkflows/local/dna_variant_calling.nf b/subworkflows/local/dna_variant_calling.nf index 27d1ffd1..517d05f0 100644 --- a/subworkflows/local/dna_variant_calling.nf +++ b/subworkflows/local/dna_variant_calling.nf @@ -16,6 +16,7 @@ workflow DNA_VARIANT_CALLING { main: ch_variant_calls = Channel.empty() + medaka_version = Channel.empty() if (!skip_medaka){ /* * Split into a different channel for each chromosome @@ -37,18 +38,23 @@ workflow DNA_VARIANT_CALLING { */ MEDAKA_VARIANT( ch_view_sortbam, ch_index ) ch_variant_calls = MEDAKA_VARIANT.out.variant_calls + medaka_version = MEDAKA_VARIANT.out.versions } ch_sv_calls = Channel.empty() + sniffles_version = Channel.empty() if (!skip_sniffles){ /* * Call variants with SNIFFLES */ SNIFFLES( ch_view_sortbam ) ch_sv_calls = SNIFFLES.out.sv_calls + sniffles_version = SNIFFLES.out.versions } else{ } emit: ch_variant_calls ch_sv_calls + medaka_version + sniffles_version } diff --git a/subworkflows/local/rna_fusions_jaffal.nf b/subworkflows/local/rna_fusions_jaffal.nf index 5cb5b72e..c9b54ca1 100644 --- a/subworkflows/local/rna_fusions_jaffal.nf +++ b/subworkflows/local/rna_fusions_jaffal.nf @@ -20,7 +20,6 @@ workflow RNA_FUSIONS_JAFFAL { UNTAR( GET_JAFFAL_REF.out.ch_jaffal_ref ) ch_jaffal_ref_dir = UNTAR.out.untar } - ch_jaffal_ref_dir.view() ch_sample .map { it -> [ it[0], it[6] ]} diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index b500a2f1..b493af43 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -335,9 +335,9 @@ workflow NANOSEQ{ /* * SUBWORKFLOW: DNA variant calling */ - ch_medaka_version = Channel.empty() - ch_sniffles_version = Channel.empty() DNA_VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] }, params.skip_medaka, params.skip_sniffles ) + ch_software_versions = ch_software_versions.mix(DNA_VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(DNA_VARIANT_CALLING.out.sniffles_version.first().ifEmpty(null)) } ch_bedtools_version = Channel.empty() From 1c708f3e98b32a28c9807692fbf4669fd292bc0b Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Thu, 3 Feb 2022 09:09:38 +0100 Subject: [PATCH 087/169] Update nanoseq.nf Fix version error --- workflows/nanoseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index b493af43..3c3548cf 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -328,7 +328,7 @@ workflow NANOSEQ{ */ BAM_SORT_INDEX_SAMTOOLS ( ch_align_sam, params.call_variants ) ch_view_sortbam = BAM_SORT_INDEX_SAMTOOLS.out.sortbam - ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.versions.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.samtools_versions.first().ifEmpty(null)) ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) if (params.call_variants && params.protocol == 'DNA') { From d86c629c4da1930c3510f3133d7b1b0ca3f07f47 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Thu, 3 Feb 2022 09:38:31 +0100 Subject: [PATCH 088/169] Update sniffles.nf Fix sniffles version --- modules/local/sniffles.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/local/sniffles.nf b/modules/local/sniffles.nf index a54addeb..d1c887f8 100644 --- a/modules/local/sniffles.nf +++ b/modules/local/sniffles.nf @@ -25,7 +25,7 @@ process SNIFFLES { cat <<-END_VERSIONS > versions.yml "${task.process}": - sniffles: \$( echo \$(featureCounts -v 2>&1) | sed -e "s/featureCounts v//g") //need sniffles's version + sniffles: \$(sniffles --help 2>&1 | grep Version |sed 's/^.*Version: //') END_VERSIONS """ } From 3c515ff0f92e7a7ade87a1520ec03b1091fd5026 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Tue, 8 Feb 2022 08:54:39 +0100 Subject: [PATCH 089/169] Update README.md Remove text and check linting --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index a2676407..805999e2 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,6 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/nanoseq/results). -## Pipeline summary - -1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) -2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) - -On release, automated continuous integration tests run the pipeline on a [full-sized dataset](https://github.com/nf-core/test-datasets/tree/nanoseq#full-sized-test-data) obtained from the [Singapore Nanopore Expression Consortium](https://github.com/GoekeLab/sg-nex-data) on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/nanoseq/results). - ## Pipeline Summary 1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis) or [`qcat`](https://github.com/nanoporetech/qcat); *optional*) From 2f02c9d3d8fd74a659867d0dfc4243fbedb5d46a Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Tue, 8 Feb 2022 08:59:48 +0100 Subject: [PATCH 090/169] Update README.md --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 805999e2..a2676407 100644 --- a/README.md +++ b/README.md @@ -23,6 +23,13 @@ The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/nanoseq/results). +## Pipeline summary + +1. Read QC ([`FastQC`](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) +2. Present QC for raw reads ([`MultiQC`](http://multiqc.info/)) + +On release, automated continuous integration tests run the pipeline on a [full-sized dataset](https://github.com/nf-core/test-datasets/tree/nanoseq#full-sized-test-data) obtained from the [Singapore Nanopore Expression Consortium](https://github.com/GoekeLab/sg-nex-data) on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/nanoseq/results). + ## Pipeline Summary 1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis) or [`qcat`](https://github.com/nanoporetech/qcat); *optional*) From c2256d0b08888b568b0f96a5826bfc51855f3ad5 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Tue, 1 Mar 2022 17:00:06 +0100 Subject: [PATCH 091/169] Moved input samplesheets to version control test-data folder --- conf/test.config | 2 +- conf/test_bc_nodx.config | 2 +- conf/test_full.config | 2 +- conf/test_nobc_dx.config | 2 +- conf/test_nobc_nodx_noaln.config | 2 +- conf/test_nobc_nodx_rnamod.config | 2 +- conf/test_nobc_nodx_stringtie.config | 2 +- conf/test_nobc_nodx_vc.config | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/conf/test.config b/conf/test.config index 397f1916..782b54ce 100644 --- a/conf/test.config +++ b/conf/test.config @@ -20,7 +20,7 @@ params { max_time = '6.h' // Input data to perform both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_dx.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_bc_dx.csv' protocol = 'cDNA' flowcell = 'FLO-MIN106' kit = 'SQK-DCS109' diff --git a/conf/test_bc_nodx.config b/conf/test_bc_nodx.config index 35c53aea..7ca3d308 100644 --- a/conf/test_bc_nodx.config +++ b/conf/test_bc_nodx.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to perform basecalling and to skip demultipexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_bc_nodx.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_bc_nodx.csv' protocol = 'cDNA' flowcell = 'FLO-MIN106' kit = 'SQK-DCS108' diff --git a/conf/test_full.config b/conf/test_full.config index 1ce10a6a..20a16d4b 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -15,7 +15,7 @@ params { config_profile_description = 'Full test dataset to check pipeline function' // Input data for full size test - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_full.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_full.csv' protocol = 'cDNA' skip_basecalling = true skip_demultiplexing = true diff --git a/conf/test_nobc_dx.config b/conf/test_nobc_dx.config index 2206f4ac..aa9db6e1 100644 --- a/conf/test_nobc_dx.config +++ b/conf/test_nobc_dx.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip basecalling and to only perform demultipexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_dx.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_dx.csv' protocol = 'DNA' barcode_kit = 'NBD103/NBD104' input_path = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/fastq/nondemultiplexed/sample_nobc_dx.fastq.gz' diff --git a/conf/test_nobc_nodx_noaln.config b/conf/test_nobc_nodx_noaln.config index 75896fd1..abec7b05 100644 --- a/conf/test_nobc_nodx_noaln.config +++ b/conf/test_nobc_nodx_noaln.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_noaln.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_noaln.csv' protocol = 'directRNA' skip_basecalling = true skip_demultiplexing = true diff --git a/conf/test_nobc_nodx_rnamod.config b/conf/test_nobc_nodx_rnamod.config index 86284506..2c5e6ee4 100644 --- a/conf/test_nobc_nodx_rnamod.config +++ b/conf/test_nobc_nodx_rnamod.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_rnamod.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_rnamod.csv' protocol = 'directRNA' skip_basecalling = true skip_demultiplexing = true diff --git a/conf/test_nobc_nodx_stringtie.config b/conf/test_nobc_nodx_stringtie.config index e4b8093e..e1ad8007 100644 --- a/conf/test_nobc_nodx_stringtie.config +++ b/conf/test_nobc_nodx_stringtie.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip both basecalling and demultiplexing - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_stringtie.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_stringtie.csv' protocol = 'directRNA' skip_basecalling = true skip_demultiplexing = true diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 10c15217..79fd8349 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip basecalling and demultiplexing, and variant call - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_vc.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_vc.csv' protocol = 'DNA' skip_basecalling = true skip_quantification = true From d3020a89b61914ef80c9c97acb5e0e144d5eb94b Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Tue, 15 Mar 2022 20:59:55 +0000 Subject: [PATCH 092/169] Template update for nf-core/tools version 2.3 --- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 2 +- .github/workflows/awsfulltest.yml | 6 +- .github/workflows/awstest.yml | 6 +- .github/workflows/ci.yml | 4 +- .github/workflows/linting.yml | 28 +- .gitpod.yml | 14 + .nf-core.yml | 1 + .yamllint.yml | 6 + README.md | 6 +- assets/nf-core-nanoseq_logo_light.png | Bin 428 -> 11262 bytes bin/check_samplesheet.py | 346 ++++++++++++++------- conf/base.config | 4 +- conf/igenomes.config | 80 ++--- conf/modules.config | 18 +- conf/test.config | 6 +- conf/test_full.config | 6 +- docs/images/nf-core-nanoseq_logo_dark.png | Bin 288 -> 75618 bytes docs/images/nf-core-nanoseq_logo_light.png | Bin 519 -> 75499 bytes docs/usage.md | 21 +- lib/NfcoreSchema.groovy | 4 +- lib/Utils.groovy | 4 +- lib/WorkflowNanoseq.groovy | 4 +- main.nf | 24 +- nextflow.config | 18 +- nextflow_schema.json | 23 +- subworkflows/local/input_check.nf | 18 +- workflows/nanoseq.nf | 28 +- 28 files changed, 419 insertions(+), 259 deletions(-) create mode 100644 .gitpod.yml create mode 100644 .nf-core.yml create mode 100644 .yamllint.yml diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 55e0a8a5..17dc3e7f 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,4 +1,3 @@ - name: Bug report description: Report something that is broken or incorrect labels: bug diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8a21c35e..f8737b7b 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -19,7 +19,7 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/nano - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/nanoseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index c306f9d2..4528529d 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -14,7 +14,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters @@ -31,4 +31,6 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-${{ github.sha }}" } profiles: test_full,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 41c8eae2..3be3085b 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -11,7 +11,7 @@ jobs: runs-on: ubuntu-latest steps: - name: Launch workflow via tower - uses: nf-core/tower-action@v2 + uses: nf-core/tower-action@v3 with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} @@ -25,4 +25,6 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-test-${{ github.sha }}" } profiles: test,aws_tower - pre_run_script: 'export NXF_VER=21.10.3' + nextflow_config: | + process.errorStrategy = 'retry' + process.maxRetries = 3 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 0b3fa161..742dc51d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,7 +14,7 @@ env: jobs: test: - name: Run workflow tests + name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} runs-on: ubuntu-latest @@ -47,4 +47,4 @@ jobs: # For example: adding multiple test runs with different parameters # Remember that you can parallelise this by using strategy.matrix run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker + nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773..fda934c0 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -12,9 +12,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint @@ -51,9 +49,7 @@ jobs: steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install editorconfig-checker run: npm install -g editorconfig-checker @@ -64,14 +60,13 @@ jobs: YAML: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 + - name: Checkout + uses: actions/checkout@master + - name: 'Yamllint' + uses: karancode/yamllint-github-action@master with: - node-version: '10' - - name: Install yaml-lint - run: npm install -g yaml-lint - - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") + yamllint_file_or_dir: '.' + yamllint_config_filepath: '.yamllint.yml' # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -84,10 +79,11 @@ jobs: To keep the code consistent with lots of contributors, we run automated code consistency checks. To fix this CI test, please run: - * Install `yaml-lint` - * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) + * Install `yamllint` + * Install `yamllint` following [this](https://yamllint.readthedocs.io/en/stable/quickstart.html#installing-yamllint) + instructions or alternative install it in your [conda environment](https://anaconda.org/conda-forge/yamllint) * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` + * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` * Fix any reported errors in your YAML files Once you push these changes the test should pass, and you can hide this comment :+1: diff --git a/.gitpod.yml b/.gitpod.yml new file mode 100644 index 00000000..b7d4cee1 --- /dev/null +++ b/.gitpod.yml @@ -0,0 +1,14 @@ +image: nfcore/gitpod:latest + +vscode: + extensions: # based on nf-core.nf-core-extensionpack + - codezombiech.gitignore # Language support for .gitignore files + # - cssho.vscode-svgviewer # SVG viewer + - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed + - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files + - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar + - mechatroner.rainbow-csv # Highlight columns in csv files in different colors + # - nextflow.nextflow # Nextflow syntax highlighting + - oderwat.indent-rainbow # Highlight indentation level + - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 00000000..3805dc81 --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1 @@ +repository_type: pipeline diff --git a/.yamllint.yml b/.yamllint.yml new file mode 100644 index 00000000..d466deec --- /dev/null +++ b/.yamllint.yml @@ -0,0 +1,6 @@ +extends: default + +rules: + document-start: disable + line-length: disable + truthy: disable diff --git a/README.md b/README.md index fb1e71cd..cb51a32d 100644 --- a/README.md +++ b/README.md @@ -40,14 +40,14 @@ On release, automated continuous integration tests run the pipeline on a full-si 3. Download the pipeline and test it on a minimal dataset with a single command: ```console - nextflow run nf-core/nanoseq -profile test,YOURPROFILE + nextflow run nf-core/nanoseq -profile test,YOURPROFILE --outdir ``` Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > * If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! @@ -55,7 +55,7 @@ On release, automated continuous integration tests run the pipeline on a full-si ```console - nextflow run nf-core/nanoseq -profile --input samplesheet.csv --genome GRCh37 + nextflow run nf-core/nanoseq --input samplesheet.csv --outdir --genome GRCh37 -profile ``` ## Documentation diff --git a/assets/nf-core-nanoseq_logo_light.png b/assets/nf-core-nanoseq_logo_light.png index d46347c2d217dd9a7c090367c55a068226f937c1..313219c02d7587b9c038c117657fd994c571051d 100644 GIT binary patch literal 11262 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 literal 428 zcmZ`#K~BRk5WM>pOV3aj5H~9lG(l7

J-waT~81OO72jb}RoLJM9sUyE8jGGwP=P zT({r52Hx8DE$sF$+szslcT#Se_EpNdtuM&KawTQ+v8aUV!(c1b6Y4w!6D(Cvt4H`E zKADbS@9>1i;=z)V7g#7c)78Q2R21&3KiPRN)L6AW!IagA!AuZn7(F8!n;^O(3&GEL z`IdZS!SoYp3ZUbR4QN~-hc4sVpItBmfoJG&#Lk2yM)p}|n3k}!gi}7^1bED6U@;Ic zl^ka$&sv*cyhCf#Eg<}pQxJ33KjQ@CIv?|QCJpD_6tkR+I~LC|e?kXMA=kc(1G!N4 VJvv>8IrcTl)qtG)%H@^D#V=*Sk$eCE diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index b3d454b4..5473b624 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -1,145 +1,249 @@ #!/usr/bin/env python -# TODO nf-core: Update the script to check the samplesheet -# This script is based on the example at: https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv -import os -import sys -import errno +"""Provide a command line tool to validate and transform tabular samplesheets.""" + + import argparse +import csv +import logging +import sys +from collections import Counter +from pathlib import Path -def parse_args(args=None): - Description = "Reformat nf-core/nanoseq samplesheet file and check its contents." - Epilog = "Example usage: python check_samplesheet.py " +logger = logging.getLogger() - parser = argparse.ArgumentParser(description=Description, epilog=Epilog) - parser.add_argument("FILE_IN", help="Input samplesheet file.") - parser.add_argument("FILE_OUT", help="Output file.") - return parser.parse_args(args) +class RowChecker: + """ + Define a service that can validate and transform each given row. -def make_dir(path): - if len(path) > 0: - try: - os.makedirs(path) - except OSError as exception: - if exception.errno != errno.EEXIST: - raise exception + Attributes: + modified (list): A list of dicts, where each dict corresponds to a previously + validated and transformed row. The order of rows is maintained. + """ -def print_error(error, context="Line", context_str=""): - error_str = "ERROR: Please check samplesheet -> {}".format(error) - if context != "" and context_str != "": - error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format( - error, context.strip(), context_str.strip() + VALID_FORMATS = ( + ".fq.gz", + ".fastq.gz", + ) + + def __init__( + self, + sample_col="sample", + first_col="fastq_1", + second_col="fastq_2", + single_col="single_end", + **kwargs, + ): + """ + Initialize the row checker with the expected column names. + + Args: + sample_col (str): The name of the column that contains the sample name + (default "sample"). + first_col (str): The name of the column that contains the first (or only) + FASTQ file path (default "fastq_1"). + second_col (str): The name of the column that contains the second (if any) + FASTQ file path (default "fastq_2"). + single_col (str): The name of the new column that will be inserted and + records whether the sample contains single- or paired-end sequencing + reads (default "single_end"). + + """ + super().__init__(**kwargs) + self._sample_col = sample_col + self._first_col = first_col + self._second_col = second_col + self._single_col = single_col + self._seen = set() + self.modified = [] + + def validate_and_transform(self, row): + """ + Perform all validations on the given row and insert the read pairing status. + + Args: + row (dict): A mapping from column headers (keys) to elements of that row + (values). + + """ + self._validate_sample(row) + self._validate_first(row) + self._validate_second(row) + self._validate_pair(row) + self._seen.add((row[self._sample_col], row[self._first_col])) + self.modified.append(row) + + def _validate_sample(self, row): + """Assert that the sample name exists and convert spaces to underscores.""" + assert len(row[self._sample_col]) > 0, "Sample input is required." + # Sanitize samples slightly. + row[self._sample_col] = row[self._sample_col].replace(" ", "_") + + def _validate_first(self, row): + """Assert that the first FASTQ entry is non-empty and has the right format.""" + assert len(row[self._first_col]) > 0, "At least the first FASTQ file is required." + self._validate_fastq_format(row[self._first_col]) + + def _validate_second(self, row): + """Assert that the second FASTQ entry has the right format if it exists.""" + if len(row[self._second_col]) > 0: + self._validate_fastq_format(row[self._second_col]) + + def _validate_pair(self, row): + """Assert that read pairs have the same file extension. Report pair status.""" + if row[self._first_col] and row[self._second_col]: + row[self._single_col] = False + assert ( + Path(row[self._first_col]).suffixes == Path(row[self._second_col]).suffixes + ), "FASTQ pairs must have the same file extensions." + else: + row[self._single_col] = True + + def _validate_fastq_format(self, filename): + """Assert that a given filename has one of the expected FASTQ extensions.""" + assert any(filename.endswith(extension) for extension in self.VALID_FORMATS), ( + f"The FASTQ file has an unrecognized extension: {filename}\n" + f"It should be one of: {', '.join(self.VALID_FORMATS)}" ) - print(error_str) - sys.exit(1) + def validate_unique_samples(self): + """ + Assert that the combination of sample name and FASTQ filename is unique. + + In addition to the validation, also rename the sample if more than one sample, + FASTQ file combination exists. + + """ + assert len(self._seen) == len(self.modified), "The pair of sample name and FASTQ must be unique." + if len({pair[0] for pair in self._seen}) < len(self._seen): + counts = Counter(pair[0] for pair in self._seen) + seen = Counter() + for row in self.modified: + sample = row[self._sample_col] + seen[sample] += 1 + if counts[sample] > 1: + row[self._sample_col] = f"{sample}_T{seen[sample]}" + + +def sniff_format(handle): + """ + Detect the tabular format. + + Args: + handle (text file): A handle to a `text file`_ object. The read position is + expected to be at the beginning (index 0). + + Returns: + csv.Dialect: The detected tabular format. + + .. _text file: + https://docs.python.org/3/glossary.html#term-text-file -# TODO nf-core: Update the check_samplesheet function -def check_samplesheet(file_in, file_out): """ - This function checks that the samplesheet follows the following structure: + peek = handle.read(2048) + sniffer = csv.Sniffer() + if not sniffer.has_header(peek): + logger.critical(f"The given sample sheet does not appear to contain a header.") + sys.exit(1) + dialect = sniffer.sniff(peek) + handle.seek(0) + return dialect - sample,fastq_1,fastq_2 - SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz - SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz - SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, - For an example see: - https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv +def check_samplesheet(file_in, file_out): """ + Check that the tabular samplesheet has the structure expected by nf-core pipelines. - sample_mapping_dict = {} - with open(file_in, "r") as fin: + Validate the general shape of the table, expected columns, and each row. Also add + an additional column which records whether one or two FASTQ reads were found. - ## Check header - MIN_COLS = 2 - # TODO nf-core: Update the column names for the input samplesheet - HEADER = ["sample", "fastq_1", "fastq_2"] - header = [x.strip('"') for x in fin.readline().strip().split(",")] - if header[: len(HEADER)] != HEADER: - print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) - sys.exit(1) + Args: + file_in (pathlib.Path): The given tabular samplesheet. The format can be either + CSV, TSV, or any other format automatically recognized by ``csv.Sniffer``. + file_out (pathlib.Path): Where the validated and transformed samplesheet should + be created; always in CSV format. - ## Check sample entries - for line in fin: - lspl = [x.strip().strip('"') for x in line.strip().split(",")] - - # Check valid number of columns per row - if len(lspl) < len(HEADER): - print_error( - "Invalid number of columns (minimum = {})!".format(len(HEADER)), - "Line", - line, - ) - num_cols = len([x for x in lspl if x]) - if num_cols < MIN_COLS: - print_error( - "Invalid number of populated columns (minimum = {})!".format(MIN_COLS), - "Line", - line, - ) - - ## Check sample name entries - sample, fastq_1, fastq_2 = lspl[: len(HEADER)] - sample = sample.replace(" ", "_") - if not sample: - print_error("Sample entry has not been specified!", "Line", line) - - ## Check FastQ file extension - for fastq in [fastq_1, fastq_2]: - if fastq: - if fastq.find(" ") != -1: - print_error("FastQ file contains spaces!", "Line", line) - if not fastq.endswith(".fastq.gz") and not fastq.endswith(".fq.gz"): - print_error( - "FastQ file does not have extension '.fastq.gz' or '.fq.gz'!", - "Line", - line, - ) - - ## Auto-detect paired-end/single-end - sample_info = [] ## [single_end, fastq_1, fastq_2] - if sample and fastq_1 and fastq_2: ## Paired-end short reads - sample_info = ["0", fastq_1, fastq_2] - elif sample and fastq_1 and not fastq_2: ## Single-end short reads - sample_info = ["1", fastq_1, fastq_2] - else: - print_error("Invalid combination of columns provided!", "Line", line) - - ## Create sample mapping dictionary = { sample: [ single_end, fastq_1, fastq_2 ] } - if sample not in sample_mapping_dict: - sample_mapping_dict[sample] = [sample_info] - else: - if sample_info in sample_mapping_dict[sample]: - print_error("Samplesheet contains duplicate rows!", "Line", line) - else: - sample_mapping_dict[sample].append(sample_info) - - ## Write validated samplesheet with appropriate columns - if len(sample_mapping_dict) > 0: - out_dir = os.path.dirname(file_out) - make_dir(out_dir) - with open(file_out, "w") as fout: - fout.write(",".join(["sample", "single_end", "fastq_1", "fastq_2"]) + "\n") - for sample in sorted(sample_mapping_dict.keys()): - - ## Check that multiple runs of the same sample are of the same datatype - if not all(x[0] == sample_mapping_dict[sample][0][0] for x in sample_mapping_dict[sample]): - print_error("Multiple runs of a sample must be of the same datatype!", "Sample: {}".format(sample)) - - for idx, val in enumerate(sample_mapping_dict[sample]): - fout.write(",".join(["{}_T{}".format(sample, idx + 1)] + val) + "\n") - else: - print_error("No entries to process!", "Samplesheet: {}".format(file_in)) - - -def main(args=None): - args = parse_args(args) - check_samplesheet(args.FILE_IN, args.FILE_OUT) + Example: + This function checks that the samplesheet follows the following structure, + see also the `viral recon samplesheet`_:: + + sample,fastq_1,fastq_2 + SAMPLE_PE,SAMPLE_PE_RUN1_1.fastq.gz,SAMPLE_PE_RUN1_2.fastq.gz + SAMPLE_PE,SAMPLE_PE_RUN2_1.fastq.gz,SAMPLE_PE_RUN2_2.fastq.gz + SAMPLE_SE,SAMPLE_SE_RUN1_1.fastq.gz, + + .. _viral recon samplesheet: + https://raw.githubusercontent.com/nf-core/test-datasets/viralrecon/samplesheet/samplesheet_test_illumina_amplicon.csv + + """ + required_columns = {"sample", "fastq_1", "fastq_2"} + # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. + with file_in.open(newline="") as in_handle: + reader = csv.DictReader(in_handle, dialect=sniff_format(in_handle)) + # Validate the existence of the expected header columns. + if not required_columns.issubset(reader.fieldnames): + logger.critical(f"The sample sheet **must** contain the column headers: {', '.join(required_columns)}.") + sys.exit(1) + # Validate each row. + checker = RowChecker() + for i, row in enumerate(reader): + try: + checker.validate_and_transform(row) + except AssertionError as error: + logger.critical(f"{str(error)} On line {i + 2}.") + sys.exit(1) + checker.validate_unique_samples() + header = list(reader.fieldnames) + header.insert(1, "single_end") + # See https://docs.python.org/3.9/library/csv.html#id3 to read up on `newline=""`. + with file_out.open(mode="w", newline="") as out_handle: + writer = csv.DictWriter(out_handle, header, delimiter=",") + writer.writeheader() + for row in checker.modified: + writer.writerow(row) + + +def parse_args(argv=None): + """Define and immediately parse command line arguments.""" + parser = argparse.ArgumentParser( + description="Validate and transform a tabular samplesheet.", + epilog="Example: python check_samplesheet.py samplesheet.csv samplesheet.valid.csv", + ) + parser.add_argument( + "file_in", + metavar="FILE_IN", + type=Path, + help="Tabular input samplesheet in CSV or TSV format.", + ) + parser.add_argument( + "file_out", + metavar="FILE_OUT", + type=Path, + help="Transformed output samplesheet in CSV format.", + ) + parser.add_argument( + "-l", + "--log-level", + help="The desired log level (default WARNING).", + choices=("CRITICAL", "ERROR", "WARNING", "INFO", "DEBUG"), + default="WARNING", + ) + return parser.parse_args(argv) + + +def main(argv=None): + """Coordinate argument parsing and program execution.""" + args = parse_args(argv) + logging.basicConfig(level=args.log_level, format="[%(levelname)s] %(message)s") + if not args.file_in.is_file(): + logger.error(f"The given input file {args.file_in} was not found!") + sys.exit(2) + args.file_out.parent.mkdir(parents=True, exist_ok=True) + check_samplesheet(args.file_in, args.file_out) if __name__ == "__main__": diff --git a/conf/base.config b/conf/base.config index 54af876e..ba9cb8b0 100644 --- a/conf/base.config +++ b/conf/base.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/nanoseq Nextflow base config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ A 'blank slate' config file, appropriate for general use on most high performance compute environments. Assumes that all software is installed and available on the PATH. Runs in `local` mode - all jobs will be run on the logged in environment. diff --git a/conf/igenomes.config b/conf/igenomes.config index 855948de..7a1b3ac6 100644 --- a/conf/igenomes.config +++ b/conf/igenomes.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for iGenomes paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines reference genomes using iGenome paths. Can be used by any config that customises the base path using: $params.igenomes_base / --igenomes_base @@ -13,7 +13,7 @@ params { genomes { 'GRCh37' { fasta = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/Ensembl/GRCh37/Sequence/BismarkIndex/" @@ -26,7 +26,7 @@ params { } 'GRCh38' { fasta = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/NCBI/GRCh38/Sequence/BismarkIndex/" @@ -38,7 +38,7 @@ params { } 'GRCm38' { fasta = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/Ensembl/GRCm38/Sequence/BismarkIndex/" @@ -51,7 +51,7 @@ params { } 'TAIR10' { fasta = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Arabidopsis_thaliana/Ensembl/TAIR10/Sequence/BismarkIndex/" @@ -62,7 +62,7 @@ params { } 'EB2' { fasta = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bacillus_subtilis_168/Ensembl/EB2/Sequence/BismarkIndex/" @@ -72,7 +72,7 @@ params { } 'UMD3.1' { fasta = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/Ensembl/UMD3.1/Sequence/BismarkIndex/" @@ -83,7 +83,7 @@ params { } 'WBcel235' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/Ensembl/WBcel235/Sequence/BismarkIndex/" @@ -94,7 +94,7 @@ params { } 'CanFam3.1' { fasta = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/Ensembl/CanFam3.1/Sequence/BismarkIndex/" @@ -105,7 +105,7 @@ params { } 'GRCz10' { fasta = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/Ensembl/GRCz10/Sequence/BismarkIndex/" @@ -115,7 +115,7 @@ params { } 'BDGP6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/Ensembl/BDGP6/Sequence/BismarkIndex/" @@ -126,7 +126,7 @@ params { } 'EquCab2' { fasta = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/Ensembl/EquCab2/Sequence/BismarkIndex/" @@ -137,7 +137,7 @@ params { } 'EB1' { fasta = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Escherichia_coli_K_12_DH10B/Ensembl/EB1/Sequence/BismarkIndex/" @@ -147,7 +147,7 @@ params { } 'Galgal4' { fasta = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/Ensembl/Galgal4/Sequence/BismarkIndex/" @@ -157,7 +157,7 @@ params { } 'Gm01' { fasta = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Glycine_max/Ensembl/Gm01/Sequence/BismarkIndex/" @@ -167,7 +167,7 @@ params { } 'Mmul_1' { fasta = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Macaca_mulatta/Ensembl/Mmul_1/Sequence/BismarkIndex/" @@ -178,7 +178,7 @@ params { } 'IRGSP-1.0' { fasta = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Oryza_sativa_japonica/Ensembl/IRGSP-1.0/Sequence/BismarkIndex/" @@ -188,7 +188,7 @@ params { } 'CHIMP2.1.4' { fasta = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/Ensembl/CHIMP2.1.4/Sequence/BismarkIndex/" @@ -199,7 +199,7 @@ params { } 'Rnor_5.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_5.0/Sequence/BismarkIndex/" @@ -209,7 +209,7 @@ params { } 'Rnor_6.0' { fasta = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/Ensembl/Rnor_6.0/Sequence/BismarkIndex/" @@ -219,7 +219,7 @@ params { } 'R64-1-1' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/Ensembl/R64-1-1/Sequence/BismarkIndex/" @@ -230,7 +230,7 @@ params { } 'EF2' { fasta = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Schizosaccharomyces_pombe/Ensembl/EF2/Sequence/BismarkIndex/" @@ -242,7 +242,7 @@ params { } 'Sbi1' { fasta = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sorghum_bicolor/Ensembl/Sbi1/Sequence/BismarkIndex/" @@ -252,7 +252,7 @@ params { } 'Sscrofa10.2' { fasta = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/Ensembl/Sscrofa10.2/Sequence/BismarkIndex/" @@ -263,7 +263,7 @@ params { } 'AGPv3' { fasta = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Zea_mays/Ensembl/AGPv3/Sequence/BismarkIndex/" @@ -273,7 +273,7 @@ params { } 'hg38' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg38/Sequence/BismarkIndex/" @@ -285,7 +285,7 @@ params { } 'hg19' { fasta = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Homo_sapiens/UCSC/hg19/Sequence/BismarkIndex/" @@ -298,7 +298,7 @@ params { } 'mm10' { fasta = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Mus_musculus/UCSC/mm10/Sequence/BismarkIndex/" @@ -311,7 +311,7 @@ params { } 'bosTau8' { fasta = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Bos_taurus/UCSC/bosTau8/Sequence/BismarkIndex/" @@ -321,7 +321,7 @@ params { } 'ce10' { fasta = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Caenorhabditis_elegans/UCSC/ce10/Sequence/BismarkIndex/" @@ -333,7 +333,7 @@ params { } 'canFam3' { fasta = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Canis_familiaris/UCSC/canFam3/Sequence/BismarkIndex/" @@ -344,7 +344,7 @@ params { } 'danRer10' { fasta = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Danio_rerio/UCSC/danRer10/Sequence/BismarkIndex/" @@ -355,7 +355,7 @@ params { } 'dm6' { fasta = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Drosophila_melanogaster/UCSC/dm6/Sequence/BismarkIndex/" @@ -366,7 +366,7 @@ params { } 'equCab2' { fasta = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Equus_caballus/UCSC/equCab2/Sequence/BismarkIndex/" @@ -377,7 +377,7 @@ params { } 'galGal4' { fasta = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Gallus_gallus/UCSC/galGal4/Sequence/BismarkIndex/" @@ -388,7 +388,7 @@ params { } 'panTro4' { fasta = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Pan_troglodytes/UCSC/panTro4/Sequence/BismarkIndex/" @@ -399,7 +399,7 @@ params { } 'rn6' { fasta = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Rattus_norvegicus/UCSC/rn6/Sequence/BismarkIndex/" @@ -409,7 +409,7 @@ params { } 'sacCer3' { fasta = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Saccharomyces_cerevisiae/UCSC/sacCer3/Sequence/BismarkIndex/" @@ -419,7 +419,7 @@ params { } 'susScr3' { fasta = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/WholeGenomeFasta/genome.fa" - bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/genome.fa" + bwa = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BWAIndex/version0.6.0/" bowtie2 = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/Bowtie2Index/" star = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/STARIndex/" bismark = "${params.igenomes_base}/Sus_scrofa/UCSC/susScr3/Sequence/BismarkIndex/" diff --git a/conf/modules.config b/conf/modules.config index a0506a4d..da58a5d8 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -1,12 +1,12 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Config file for defining DSL2 per module options and publishing paths -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Available keys to override module options: - ext.args = Additional arguments appended to command in module. - ext.args2 = Second set of arguments appended to command in module (multi-tool modules). - ext.args3 = Third set of arguments appended to command in module (multi-tool modules). - ext.prefix = File name prefix for output files. + ext.args = Additional arguments appended to command in module. + ext.args2 = Second set of arguments appended to command in module (multi-tool modules). + ext.args3 = Third set of arguments appended to command in module (multi-tool modules). + ext.prefix = File name prefix for output files. ---------------------------------------------------------------------------------------- */ @@ -14,14 +14,14 @@ process { publishDir = [ path: { "${params.outdir}/${task.process.tokenize(':')[-1].tokenize('_')[0].toLowerCase()}" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] withName: SAMPLESHEET_CHECK { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -33,7 +33,7 @@ process { withName: CUSTOM_DUMPSOFTWAREVERSIONS { publishDir = [ path: { "${params.outdir}/pipeline_info" }, - mode: 'copy', + mode: params.publish_dir_mode, pattern: '*_versions.yml' ] } diff --git a/conf/test.config b/conf/test.config index 9e6b35b3..ea01d767 100644 --- a/conf/test.config +++ b/conf/test.config @@ -1,11 +1,11 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running minimal tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a fast and simple pipeline test. Use as follows: - nextflow run nf-core/nanoseq -profile test, + nextflow run nf-core/nanoseq -profile test, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/conf/test_full.config b/conf/test_full.config index 09bc6482..e3924dbf 100644 --- a/conf/test_full.config +++ b/conf/test_full.config @@ -1,11 +1,11 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nextflow config file for running full-size tests -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Defines input files and everything required to run a full size pipeline test. Use as follows: - nextflow run nf-core/nanoseq -profile test_full, + nextflow run nf-core/nanoseq -profile test_full, --outdir ---------------------------------------------------------------------------------------- */ diff --git a/docs/images/nf-core-nanoseq_logo_dark.png b/docs/images/nf-core-nanoseq_logo_dark.png index dee3db82069b61e9a5380d940355f47ff565057c..408f9afcabdb7d677992732f35979138abb9d40a 100644 GIT binary patch literal 75618 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%0D6Aha9ZZvy3Owj0R@{kHIA1_W(q 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 QwgSyWD-BsM+%TVX=zX#so# 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�ev`Q}H7y#R1zKkC5n?0_OP7^FqWWeXhX0t0pNK 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

)bNtXB<>| z?zw$VG?;}cA_WMLuWxkpU`bqq^-gI`l!vzyJIgmqm5DEFjm;@^zl*oW_s|8wm8e*b zz0XFbT9w}8+|d^`xK_6-vkAYgt=Keh)4pg{f8qatTnp1$c}kL8Q8Mn_uNQo(tIlKi zpX6ZQc^`-|an(4vp*vd)^SNh=Ro#iKRpvBh@*kGgjw6S?q%KHqoeH6(_1wIA`lV^z zAiRs`A3r0$<3C?@`aE7#*py0h!ZV&RT$9)V_a4o83@+F_%Eo_IXpu`p#0RmnkYKV6>PRTk%i$*vH0e2KA$-EIE^&JXaojXAE*53ZKr9x)`Qum z7UB9BUT@5(waVq@friz=*QwcTSIWnOG4BIs|6G-zA;m{oOAc}4!>le3X(;(rUNgef z(7*5!tt5aZn8P0!173!kFHC$!crh8;jTxMQSIE;}csC5F6Vx;H$&(nH3E%(&HAh^MAf}e0nfSMQPOniL_ z7j57+Bi!(wmiNfn2t9a|2C1x>?Ls7;Mf~#%uyxQ4XbR0iiZG~93)7HJPQ|COV0;>D z#;*;}%i>vM=bScHgBHF=!NCGns4A2;tr8_sKh_4a@ zt{B5ZWXgYDXOdJtuC%DBe?Lald9&;{9%iclNek+#CCvfe_-`5NJW@!FZA`&&O&=p9 zUwlVLYHm&ldOFGYwv^64tn!6!H32EqrT>2?b9bz=kKq{R5PdaZBW0#`LK1sQ18{uJjq4Q*}wb*uTa%(>{4%;VK01*KSq zh^qcE(^@tu>pk>REghc5E4ZPCWk%EaO%C z&%%0tbPv5YmqdT&R)}mL3i4XV6jvmR@TXK!7qX{ZJj;Gln!(~06Vc5%7Z>XGw*|CW z{3(&T7JDu_+<_&!Qbi0h)Zwm?Xj;_}Cbifn__LJbIWH-7#rR}P@spEbTfxO^XYW%M zhJEnJEAHE}H`p5>4E?|@|MY1)YOBU;fR@a2X-nTo)!{n3Xe8yyJAvAW=7UAr+^*hFU0;)||N9fTIy zB@~>=9fZueR+b%uo2$%=%7YAE@|9h4K3Gnr3xsLX&S#8Hmt95P4}F2SFI?k!cZE44 z^2&Ay?B%9a<(R{>NER!X`!cultn!S|gQPK!EeGM-a%y_zD!WSZ*gKbs4pw(8pY<-^ zZBJZw0{4iaQ9^ zT8kD}ql$!cJZi)g!$|5ll7vYeP!8VLd+Mk=2qkg8GX(MjA-$f&*W^R5TcrikeH_3g z2RzjTDrfB$SYPI)M3L--)_uH^7i!obxP{DPi zM5t48>!<|&hzBc#kyj=3dbup07F$XBsm!&;-|?ih7;FeG61KWhHgd-0#CxaI2<~64 zohOXU9U8pb+TZb2+zY+0l&eo_^T46u{q~Ue|CxIAMORWHakreaG}#%Q%Wu`*Og7GV zU(<`Cn@pWKnelXBd)xB7O*ED&nM^4DsVG+&`L>C}E7;)|eoNuO5us;xlLaK?UPnWL z9oIsOax`n6NWdBgeD0uZkVvFNYZ%?+(*c2XdpL?3?WayfRx`iGtCGnq$3sx;Vx(au zeMO66%Z|@fLcKSiZ}rdp!ka9fSR9_AmJ&!TPG)LeAcVXh*qv(ZH>Fx_p?Z7S7nWz) z)ey*k3!|#s(e?>@K9M-NqOo)0su5>}F+r^NmaMFtnvw_?(x_3SS5a+IXoVT<|7f5n z-$buLmMlGF3C@o%cq8VqPK?AJsprrN^WyKE4no3s8pPF}Mx72q;$0I|xYfakYG_Gc z357U>Rwm+~cQ?0o5ZVLAvyHORs^qFRX=&JXjNyp<-C>)ib3q~29*v;gHnL2YMhrPvbt=vSuYW4(cr@f z8=UnNlqNf&edfv)#HSxS=HRS5$s<37`H)w=WnJZkdw)=f6Q~4HzGpHu=cCi6ALdP1 zOCr9WAv56gk*@9&ED&R5pq8^O508?s7~M)Fejy@&lnCqs11Ju?5*TNoMVw8rVifFj zD0Up1el31t94lNCfFJZE_M$Bg$??f}Y%#sOy>j30VgauF7cy3Jc`~NLc@mm zb8?LBF*sBh>XCT{wRV0tuIBgEOClz^!hqnpS-}56WzSQ*Z%VqH3wb{?>5ydo4tnPU zxyUu-egF3R#hbM+cj|mFzLvWi^Qho&TOYdh=><&`I1208d#|_`Ht* zfRdAjL*2={gxY5jye5M9Fzx%{!{{ykj`IBreyhrM>4S#a(B$UT4niMF_`CmYdt<}! zv8TF&?0Y&h^K-)qPt6Bqvdv`30^U!{lAW*_lN~5#lp;HEsikw`{me=8=mP$JDi?Wt zpa#P;VlYn}B(4JBW&+~lL7B{A@a#9uw?wkCvgxV=oB4M7kt}3Vvit@|LV5W!K?I|L z;3>H|#C-&2vSf0SPNeU_A;)l4Y=bTzbFMEopMuqayJ>Lz%MeuS)id4_(^6#Vsx^#o zqJb}O-d?j;t$TRbuU`6g@^K<|lER|I)?xgC5t-FXN4tI4sFc_8?ck z_s6pNjh^u1IPD}Zwz6z0QHJgOnmH*Tb6H$7o)*DF6c6r@K!6SodT)WI{mhGGYJ}Iv z!G7g_coQcvliHBmNaKOzCs7eL*ZUIhBH6^Vh1?Ut9Hgq~`^Uy{HQT9hx&FUXSiT-x%ApC;r_aezH z5*`hvJZYm4$ztvx)wS-`9#1_?{hdO*b6x)e;_Sl70nEZD-K&s5e7azHJS6&nIr0Jy z?hX=4@T`nG|L}!jp#>f|MKlg4`HoU`vDo%oI}t>JFDa7b*?2-Xjg7j)tL_sR)!fA4 z23JD&1o4a40%LCb>_Aj+KL-dDo6-q&IyRM3Vtl zU6Y4%0zY5B3a3h_CFR^*rw14cAhz554#zc6UOiEcHj1tR-a)J!uynF>Gtjm(L5vac zkXVJ}Py~5D=3bgQMWH~wV;yehqYQ&q*5boqKlP*5;s z`X$CJ`Am|30f|^+vYK=ms{$_?=mVJC$3(L1Ny~P_IR~dzTaL2&%qKA?v&>rSREbn1 zkzOFc&M>~dF3>-o5p){uFYMDUgU?T*?8t2ujbV>sTsYHiSGuKX-cIu3QDPS6oVyA4EfZW2Xu4$^yXXbD|MOyt_HljBV9W z6`249m?4$_7Z3xlgJsFO8%4&}bYl3;ZyYtwQ0-PxX`kA^+oQ_p*x74by-6~1385-` za4&r=N%(~UHR7s(Dk}VPdPzeDZiiDz89;xt4p`a7Tg6>H)D3wmCj|!yibe7T{AVh; z*4=`{Lh%R{UP?R~u#_Hh;B9SUj(aupz6921>-B58q3%Q7{#bHcIb^a=%!{q|0`7%`CQcJU~7Riz({dUF&@K;~-%)}AK|MpP z6Vq)quNDoPAyEd~Zbr-yWc;Z)i+Ff@&0EFP-0rD^+#qCOLB+7J0{)#VaJAHF?AKT} z(v`Yr>SbyflDqkG5@ggM7A>wpIw7u#q*V7aSJ^-QJIP#+3%@TSRBw}~2Sq{JXiSHN zCvYnL$RPDV$sdq;5H!BCyKVExK{i3sTToWE`yQkVVmeuft0<@iSmwbkZ&W0`8Hq}1 z8pY?Q4kVmBAl-6C3703W%N+{L$2-ptYO!Xr_!s~_mYIKk#TD0f#l(r)50*1O zT~}6fshz-2@bN`%=&ax6Q3Rtco!>Xw+yDk&7V_`#v@)#s*R1XPkO;Kw|0ka~6a zdfJPaG8moV6TDf9k{=LetjpsNUZc}^*~h?omwZo}fmCQuOonx^b(n-}IZ3?t4W_#PZ236ID--qTq5GeclbvmU%r!C#T|19f7bM={LI z<$K@Ay!9H!DU!u7g?@d<%}CWobKJz-j;*zV=OZy49x4J6K894zlL`2^25M^|_z#AL zXRIxR;0&gwh`h+Me|Am;a4OM@*YSZ%LB0eoh2dUNAF~gb%BmMX2lz)ubQF>z&k;|v zXuXMHT#4$qC6F(|-5iTQ5?njvOXssIn6VZBhjT-nLXa_9J10)*#OMc(E~FW4_y!tr zpyow~JQ9{b<=G(42t7}_U*5Jis{Ng*(?eYKObubVVF;gk1;H1)`_hAs*i5FhyV1qL zn_mH!s86VWez=1m?V;$Vt0F!bK8UlrJ+X$$yoR+V$RpVdzGVrSVUrMb0r)I=BJkO% z_;ZL~1d55oZ&JGEJ7*n_=(lfD$}1Lk%(0H%06I0>{Em<8P@p2|9wmtwi94%en3joo zs5BV`Jf6IO|8BL{_3tX)rCp({-nhh}lkUihBo@j<`rW%CNRvD3+-zQN=HxCtvKuP| zNIYrR(!Tx^zCmRB+hK=BhiGvJBknGgf?KLqy8EO(XPvTw#;&~3B2aSu>7@gR1*ApI z0LrjP!rn1=%VhYywzo8Vfkez_K2wE(bANl+7!(j-Sw4~|2#VgPke%2TlsM#>2O zLM}42U(mDn^%}D32eRO)0Fs^#4_|RAO#u$wk7Qv?pvUbXdt{J;J3n6>YPP3zAc%2| zPvr-S$1_O%i!FnFDWk38P|nv@7)5NtM)P?EpeFjkip85!G?Z>Kt`3TKiU>k@Ntcr2 z#P?Bns)Ks){v6ddC*TseBo`@*_fg`m*AQz7*N~vkU=p*%bz-r|l&0E^;EHG2hogJ7 zCu*dN>lLXcfPHZSc%61JbC4yDBXEzmnAxoc&$#U`**7>xwezv8^?kb+LEiUk*vCQ< z7L||Hhfe6z;xo~-EvoBw=Vec1^%8ZRv&%|J+Be~9bP{&_y^J(7RzC_{lIY+z4=tj@ z<}I-`VGYH;h+>$^M(_cWr_3@9AZT<{dA$!Xh+&&#MKY6opZk-mKsA(SpLEx<$y^Cn z4gkx||C00p3n8eH*|2aioZK-IBa-L-fWcVn}SELDwx)Jllb2CHe3m@i&x>cGr9Ixs~!M zOG^|wxxkH`PTJTw$Vx6q7Ax79yy+6I=BgXb-)k6Y82cgezic&j=wqQLOON1tK{+=X zpWj+L2-Kss&cf)H4VjJEQG?~4_z1!Cfu8!z!_~*+8S%dTn}^P&d(*_}T)uaQKEDMB z0M~w`LHBpvNQK~#Louu+Jzk=+1pSQ(JmX9iy~{1i%Eh*0F-nab-tJ2*b{NC1GBZkm z<5WTuPy?R>lK%5c)Rw5S8C1f%69VqqvsTC+|9xOtHLX(Gm(+n1R|+kgDIR!cZe^SRw}7d z;1&em1-gDV6g*@e4JNquZCras|!I3mmu2_8wnNe^b(RX!YgJmR@kpN_+ke zN`AvRg&|j zlt6_`N3vKGh+P?G>H$^=Hk26yRz|@`CzS8?a?UqmvhMU)n#Q*q&hVAJM7=7`g@9pe z89^<=G(sm_Xlz7mRswoTyYz60oQcfIC5`WJn*c#XDC%LR1XncX@lk5zthKr8aWR6g z*hz(MArpKerN|aCl=H|}N;ULiw!VkJdB6UT&f3!vDrVG_N30uZJ*3FGavst7@RE(% zQ3-P_&_?8bq2tAqnG~n{@01>-qa3GMUVkVib@76t>i+aY#M?422j6bHc9ILyvS*B> zQQ;hTorEx+5%Ejntqj?MpK@L-A>*grn3}Xmf~eL9A<3fu@V^M${v%Mb`npo{-kWab zY$g4;waJ-CY5_)}&t6?C)$H8ON*&Z{gA*WkD2AnI$WqGr+dDx4Jha4IECI7ORlX%xLkM2S>PMcfQAoTHXiHgre$Ng``C+UO#Tf z%h)nwFM(vfd1`y)$+e<9#vF(0WB#2seWeOrC8+#Sznrt;aTFq+VHge(W zrLULV-9kwxSkZvb=A>{4q$?@Los{c>y!(<4Z}}x7H_1eA)Vm2%hAVvAq&Gr=X3qss z%ZI$*`HOR832P|h_`UCt@YeCB?vDk`1ijIFpj0~S;5t0+y?on^xUzWvD01NIzw-6X zg!GOMi0ue9#H92NEiey6Cu+B^icR#ZYNp@eiUFO?Nfr7Ruph>k>z8L==o+C44y|SzJlM0I*>xbKB8ipr}PC$Vq1>q1lcQUVmYSy6QkL>A*e-!H* zE^(h_rDTROBbAFN7eq_a_1wd0CwYNzI#a@`n-!AuwhhFxQXr+>8N&+;k^;lb@8IM0MP++-^ot&?qrdT% z@mt^g{?3Z;HrZm^T9}sx)ecIrLxK@CD-D*|m9|IDBSIvWPqVHyJ{kM@xVB3677f>}YM!uoen+4Oz@ixxU4lLhmdnA5_Cq zn!eQCP6VBdu#5-q++!n15F&4}luzs{UuR55zOLgFrsna*>NC!J?Cp@C$r2nxuAoQ6_@4>i!6BY@q3nq~DerN>eBtm6*u#Q`uY>m(|fJDWc zpd*|pqn5K+7*%^nTL*KYS_V1t6%vq`ecJ&{84B}oF zCzG?le%RKJAo5Za*j|fNy}S>y9=!0XA^r$uwZD_MT)i18>}k80A($6~-0{+6T>DhH z))3w`G*u{EYE@%Bnl`c);H`-I_l(mxT>~H9CT$R>H^+UeV*&En!Rqu z{b+UcK~w&8PUYTj?1*4Qo4e_xVehcV!aJ`ri#6`$VfW$Z)xp#{#z~hsQAf`=ZCNL{JQMT4Pss0(=nZcMfFg6F79R(b&tT1 zA~R(|O243sb%AyG9^}`bKkgKq*>=nPf)x~SUzz6ij(RZ7+V`Tx0@d|mcE1L^^tM(30<+-Ybq|(J5AS4>HfrK@Y`q@59{K__?e~yDbZ00uR4!EC zK}u!5t72Q@REmf9ef}1&kj+`|1rPau?0xw+)bIQMjESjaG%3njh?J6M>}w&(RtVXn z>}#@bGi{W;g+`suhTiNnz`q?ulrgb zkL!6qA++O*ey0gTqkrDgQBJw^v~!HOE(Q%?@?Nqq{TIacXZCjQniob;%|8e4LS$g3 zaga@*Y?fjBw#M!Xic8Pt7O;WTa&0*C!l2d0k-VNbiCW+G8uUQf^CyFmgJsOh{)?Q~Go5UNcRy2iw6KD&|WoqgJoeQ=vL~w%ikh@od}KYY*tG z!Op*U&VdPQf3vgmmph8Th-tgUas3#FoiGQd1U}KqZ=KhI*EI+UQ)9p<=j&=$WvKqQ zijC0P=_r=Db%vj6p4l!HMND;jP99t9U4|AwtkZ_t$zeDAIK1z*+L~QP?bZy#0(;#G zr}?|{bwi)n{+t{fxHcmQc+-&TbT5-Yg+drbQ|5a$?O9#GyCdwYDHUUCBmDdNr3in> zjf|rdrr*9*7dE{c%F7gV@@c7`-bOZq19YPUViB8lmjSfP&`SToP#q?p!w*xV+okIBfWd?X({_<9<)tIYImG5ObOx zPpD5vqxvVZIPBS2^-s>|>d(ZD=4gb00@QiHKs6#$(fk7aLY-gt zk*@9+K4T_(t@RrFfeY{ed>Om4Xzt;s8x^g;@*cfrm%8vwUeNi{ z#`=C*t5NTzn5SWDix5|8MmM2=DCK(i+iB)~Z7PgqiIfDz-y^jPd~_%_Bbq1o*e*#iW;LeV$%b*dey5nqP zJByhvTk|?C^?i80e+qUPvosgGJ=9@3S+{xRRd}BNr@HfzQlYI0MzXXQ2JNB#>0)>J32W|8ce{m_vaHt zcnJF67W0!X&M;YxN?I8xfQd+I-{&%@$yxWf;hj;rFa2WUU2y>KE5TPw;xy5d&noaP zxn{4{f}KCFF0NjECpq)y2TQ2mbaHg_;Nr6*Pv&}8T$OF!tiJaSU!HesTJHRj?@_rr zI?=A*KbtEgqvIy$zF3#px;kLCeTX9yBs0+ct`VRM1kQ8r<$do>R?eV4NB(XDi#YAG zdRPCtvq&;)^(z%uvFzu|sIXCcr`Nld5bpQym;Q}}n&>k*(V3W4$Anc^=g-&uUiErX zs=l}(X!HQ~i;MN)nPqFO%5@dL;sz}WJbuSjXcPVf%_@V+3?D4&zDio1ubJ?W2(9@O zUf1&|G{4WETsBj)NX|a`O8(Rrwtoi*ZYaP&#IUpT_4A}wB?CSX8Mbk?f;}E@2@ODytVr{pZ{jY0E(}5=lL8zrERT@uA%o_*ZP8g6(bd_el^L zObdMf$Ev313^y|*>NU@#<$uir%&@-;VKdze8|mJn2m?7**CH~O$Ji6rCFuu~d>+K( z+y7MpAKLGfD+seCuf0AeR18-6&8~0$vFdDhO|ShGB!!+&7fLn{73>R3uOoK85i>Xn z+CtGA$*)?EIzQ+nbMP(17as{YKd@C1Q+}XQgE1t4B#%M0@O5i>iGEutOohDvTIm+)ZCP@( zdf?6xS9}zTec9YJRK`EFaZUw;?7L5tF{rtB!MOyoR`nrkjG{nlM`z3)^5^WBUuFV) zLfLY^(E!e_5YAbjB-W=%9*L9nrFKmF8oJ6Hpmzw)rU5){#!a5wr9^n zdm~H_C*S?a+4;%G$UNj2;NF!Q1}Jc@dB;voMCy*F_}kyE*=#U|O5(YG0L!>JNg~!X z4s6w{zkm$4FbqZooL7z=FTXR99+cq-3d5{QLfgdI`BnuPmdy3T4K|(x8?XAE7OYIi z+vr}4#q+$zBV`qULvvq@FBV! zBOaZOu0ev&G5Y0If5%(}qUfl`pJm8w8jWYTVbaG6!^={wP^po`9E*;*3)RvqvI!)_ z&U-we8G9L;mG<6b`kh}u7Fur9T}5{Ka!6c_EjNERYWs4qGihdgj@8HI6$WoIib zHBj<)S}U2y^Q+mz2L4O&&p+C3PAu`fs9o1?i|GTBv7{phlu!Mu{L|`I4{|}P7`i&G z;V1vpL*6AW+9Ldgm(>Fqb+nW&)a4@@e{^X2KsbXmc`W<@xoOX)S#W^uge+@n)jo92 z?dyCacen74bIZD%5z0o_hm%@)ntmWW_~6uAn0YeL4iSYd7Ktc5Vu0j$kkv}p=i9e2 z@{d9(?iMo|FYQvm`P!ySw`*V`Oo}Xkl-RPm=2~i=t(>nU2{U}~wTO)V@b92Pb}bZFqC_7+G(NkA1PlKYB-*wD zaB~?X-_%ff0=Wfa0z8C&NgjWyi+1}+U*@dmuJDr`saF3(39{M&Pybz?!eJ8S6%t3~l0hrnUM zAS=l4h(!?YgFLvR6yl6t$raMxJ|Wj!?lvuY4W zxoe>-WU_)e06B6b!33q*U>yBYEJyd?hMv#vH%VW4-8uz|%`oE4ZE*iMOK0O-V!Y*1 zpCg_~`uW)6`}o6*DCT#?={G+O5BBup>tQzsK2I^a2U!Y6KA0DGdR!}dBHOu`oj~(>&=DmI+$+{-@P8)|Ab~nO5%XW4pz*CK{F7D<2qL)jAJ5_%U z4z{Ho5I_L)w_Elg%n$mVce8ttF-AWl;pCr}yqCwLbNEnpOz_a_{sAoC@yjwW-Ov}< zv*>4gxydT^70uG<2q~kwx>R&tQ{+`c&sg6{v!402ZxS$;iCJqj zH(@fdhmk#5PJa>4!=C;&J%_4DT?yM(uN__?#ed~73Q1*FH}0h&~c~BblUA{ z-ypoDDQUF>NKqF#n6LGYUT~-I7nH;Xy?uPkInlXr|D98#MmC!fSG+M| zaD2l*`W@>OOk@#_%)_4Ol{|Z6cX8TJw6pPJA_1bn+%{D$Zq=|u!@G07r5X}K>>{0W z5eeQKzbuXbzHfVf{3y`LOauFX2Z@Dn(*_Zn3XJa{)2ijQaQx7*)V(}mW-w#6*sbB4A7X9SRyy?VN+PNM{SGLYV@mxahN}0g?j0eiyw`yo^ zzHCq47R+|Nef4&;Y1PW|rwocVq1}zU({ZQ!K0-fZ0!YB$VACc(#(t9b!`eHQ*uIfQ zbp1nQXX%rw7svMZv#jcGtV`R#s0+_<8y-d+et|0uEfyh8yOuB5OUwehDytd*NR?SXtf!2VTeA=en zw`^*oU!LYb{w`fsMF1Ylo%`)Z=G^`@lP&>OsU2nW3-qb=KdLqZaqS}6(&n$m1~)EO zg;`B7n`q^ftrzBMzmP^M-CYSMEPPvUJpYb+Ymd6r2SZoyI->K}z+NJVs}-*4U=5|> zQ~884u_rL_`kWzdcKbvqldKW|v*+`Z_VR4lT)Ua^sUTJL0T{S2gqZAO>t|lIsc^cx zZIs$-s${9`E{+>NQ^2fR*}qn*vQC{^54by?Hh!9BvbJLTc*V9Vtc>4u*!YMRJWDqE zn`gNUJ?3Gp6F@_>DEIcCpp`AFSdrJP6{f!t-zof&-f&w9OAOlKT*IK)soV<}*@A(_ zGe{5F2Blqh0fsRj*tYgJal5_avVym|Pw>8Mw&aYv&uds~>@IUf`! z*6!llAN@i`KPs9F_BP#Bk4phYov{5bCdIZGPNQp5u`KpClm?$PE~gauN;}lUL=Ibbz%z0L7pC2V`a}j<0c+Q=AY z-9h7|-G$#38by(ffLgM#Mh*a(?=<>f3l}q{Z2ttDKP_{HTN0LXA!?^9WZbUg@OKI` zPsm96>q3mJWniJ6B9gr~hc%ZR!8YRO2Ox(%vyufO%mn`5@^68-`Qg@I+)49&8$h!G zO(-1wGM5PB78$n#ChET~G3o-}d@c6ne;wU}bzh?@pl?AuM7#j{Ex& zG7k{2y0M!O2xD#G=-XUK7zf-zYpXtF0_+xdfRYVNx^^H;kj-GXgS>o#PJ#c~WA-;F zmj8}p!}v;c?Rr8gY$79RMT9;Fag;GupV_=w6EJjlFKK2AErL<9vx~>Z#C2d8vE;m) zMEso15keLq4P5YfmcN6vnA1(q)s zy^gC?+x~i+|2#-{i}B?rFv7U`HDN91yu{YzO9F&gg-Ic?Hu!)HaZ%mx4Dt(8*ib<% zUjDyS3L||aRtC1QIpV&}U&&ML+D*KA7b5n_ULI>K9Kgt53W2e-0ZwU;tgyT-qU*cH z7_+a|H!xpT+C_5ZPfn+;1I&s}wyu3_L2VJFBEVu`&hejp;9=&jmL+*FBp-(#8r@K^ zWV`~N@DAC;OY8dSc3o9JTi4Yd&~VW^39Em;BP^wpAQImG@>1#rG8Y(;n!`_bnjHKU@;f@{xv;7${2GY>`|D}|CeI81-0)7kYkCcbaNIu8tP9@n9!+W3_2lGQ832bcKk6hk`RmR(t`li z)2%-_SGj`HL^dKMm@)fK)3%zit>Qet)qnNJ@(GFE{*PZtsl&V`G8N|0$v>baJqjZm znYoa{&;#gd!OG_cjxi13C8cYfTdcp1`5^h(t9fPl&N!TKRqx+X&9}4!1~c+=uU6rI znaKe_D}MxL>x!xFI$pN4HLOA%ms|q5&bEbf-+t))?V| zJob1mPwL&6cq8`zas^14yllbH_9A3ZP=lYSRJ*ru23R3!sC2LYOh~HO=RX2cLODR2-IowNx?7k}$mx{)s2uPPjAiKPz@J9vwiaAV)Ny za+7CNZk*s`#bwLyL`RYN5$@Z3`RL!f`4_s4fpj`kGBsL4UcFQ^h?pSg8@fF(n=Z7x zm-&|?-aKq)m_3kz7t?|ZltF{#4i-wyU{HxsDAsgyrk4mk{*i*_QV@;^4G?(mx2}FM zf;LefVFH2012Y}par{5}GqPipi9OTp4_GONs?dQ;fo%A8`1ZPyno4to`@Xb2Mvp_J z)x*J-TkSfS8a~>|)r3B%Xntq+=hS6MP! zAS|F3s0~dROcZuX_&*<(0#ararA1CuC;Dk3{i%UDQ4~DgNn{ zw64(e2L^W|&IoDTeV~EG{yN93k#j3Br*xk1!gWHH|B!)(_OD>F_nv0|rw`2To{2Ze zcwlzf6d$Qk6!-qqWt@}ohytm6qdYGzJnr3n#l?`Y{C6u--pw3^KmG`h1cok#tSNUb zif#tg!1}k0$6@~cUxyIqze}J^OW`lve75f2ADNH1_3zxv_*S;2_~xU)|6W4L_TM>v zbJcMy>%VghV-<-|7qcWTKJcf{m&NuXAA!yZQ=C`dBSG&MPLir z3wE0_ZJ|1RsmKo@93_uTS#5J=lD<4L(k+@O9IdPFT4zOF+fMCy;A)MHTH_BQw%Y8YQhQ&?c$L+1&VJBstf(8%De5lwY4>XP-GJ9QtJ;t3 z2vfKx{P0f18Vo8B$)Qsdqa&+<%v7_g2li8zibRj9ZC??J9if)&iY>LFZJ{*+rmQbN zQqUrFrGr{ZU7;Ao2z#ph(-5W1wMrGLd`b0MWmHXS@)NRr(!5j1%ESs`V<5DKy*$xA z`gc(}V|PwjkeHYSZJ7%sdZpz{*Oyfa-HPnGldUCw#2>s-p|9Yv@nH6gwMX9@mx<_% zdGdyH*cyUr-?&CzQ^vkJa5v&TUdC-Pbv96E#m72{+VI1>_894E#yq~O59M9E&YtwR z(vQjS%7~g_(|)#lE-&#x*uq`1J7jk+?Mb@ceAwpTeKERDuZRuX)W~6aJ~@`4aKhWo zQe3MIuU>zZc80ccu$xtAMA*T`Uiy_Y&LU6Jy(h2=?j2PZlP^n5UVh=f)g-E~@jMDQfjU zPB$%elg>-4*w!Jl*q#vPD9t~!#eH7B<55M!*%CopEOq2(D>=WcPWgeo+LaglY2A)B zd`oDWeUf0@W4ZC?3ty`%G#2;ZdD0|DOCsDJr+Uk%l_gk#8hua&$~c*(-;07&O?7c( z408-n1BP>QFYq02-I&~&-I+oWeUC_sou}_{W?H6V(!}CDYVwQjxgGrdqq zOk!hC6>q1g*Pq18II(Au1U(N?+aI+*`PBY$BB$|RvjBTs9Nj0^l{|$!A9p>yT`%=T z%DBH(k0Q_Szr7$Slhz)7N2$Fu-adWap5{TENTFoqIYtJci`?GLjXFu6ElaR7IbO3( zEvmYd>UWmQ;}=}lGMAE}Lbt^@};wTD%u?O3sZD!Yqy zT~DY|@`y+_x7KX^EE{3B1CcUQ@{i?1NYnixZUW}|`U1g)1C6~nGS*Cu8Xtq~d4^%n@9$z~o zzQi?aSKN3FPZdEPfi;C-lyhdVt?N= zaj^_@h^64P$ksof)E>5^#>Xi&EGjr@(5FFY`V288xzAb|4uKwSynck9#B3JL@pr(IC$}cs(s>a2}J8v{qo;SWor{{ zaaH7xdCb%PdRsYW=>&aGbIuoIY@q~|nmXuO$KODg7O$ik(|XAdNdZAVd)XelOj1DH z{NjVXI4}&8;bjF~a~U%g{i4?KR_mlP-}br7v~0Xa>J1l;huvpzQ_~*A8T%3H`v9Yi zquEckRmWwjKUFH)wj@Y@MyW28kGh?n^4jMx{aVtB0zXoL&&5gPY$#g$2Ux!I#idqS ziT+7`)T%u7cEfpDsfaoKk(QI+AvS^hecaZ|B{J=j0;C?E#`g9j}xM@7O2( z7$tg`S?rBjsFX!7p~N|K+EL`^D(=f#8>Kp3 zKC1Gal<#p1JI%v_dKskKp4@tBKVNUD-BR6bceg=QP>;n*$1u(>+ESJ^AGH(vnP`Fv z+bS**gA-v#h9NCne`$J`7z(DcR_~V0la2B9z){sdvR@gI>b%5omJrU+jw4ee!(L=V z$0xyx+hva5zRX8IN$V$7c&Kg@F=$*I;MoNqkUV;SF%`U0AQf zbk3xEPnLhM&|Z-O+Z^;RtkiKO-{X4lH%eKSw$NKC7Uszsvpcaz;PsFBTN3s( z?kn;kn>&fDyXIli<)=cPB(}Z0c*MEgQKDbX``Tc*(z*epk#h0X7wtX6YR0IITlTYF zQtrwzZ&;ET3f*rz-D-~HfLFv}}M?ZG;<><&rJ z>k5-;+Z`5sI7qc;c>dVafQ{;6*``OXEVV2a38XHQ@YeK_=d)eN(czNTgMKKk%OfT^ zHyld^hy0V~$2-QwlOBZ=*xPk{OSc>WJsk%<$zi>Yd!C>h(Y927!`ZVVxsWp-DK9bU zr`372XCHKV6W_o0!dtR4CAM1JP-c@xK>UM~+b=jIOY4_yb%=1^Vl{Q%dhH8m$gvDk z+|ClG(=)y_TbcyUTia*vN%ds4+0gHVaq*t)TwwYRz()W{rvJy|^5Y0bdR3S?u(Uoj7yE|Pm)As^*SkunbYC{-%jBRKe& z*kyOeMn@Vslh*yn>##|9iN+t5%nH54J&mn-N~(s*!FBIbyB$@mt+rI}g7-$oEc8*y z7fAv7K0A+Es3)J9#kC0aG`bx147Crzt?t@KD;0ilRjO6_Sd!#&6JPehSS>F^)<#NwsUo_GEvFik7?9?B)aqD zoFmrj1l8+BxRFCEe?@BM&EF?kecCy&SqK3pV`GQb>xx^d`>v~oY1DrMN9M>adV$MB zTe*_-0j5ZWc$6b(YfY;l&k}~|+m7irNs(EVyaRvtcr_&=&=(xekM?h`#^XG)F(*!g z1cD%elc=D@DV$HUi={bXv7LAJhvW{v7QL=2UjI-Z&Z8f=lk6hJPw1Re7ta)Xn_`lp z!7=YeyO5{0hQ(?-i7eFa64=?A?v@d-^e%k`R1w(lHdZ9BhBPZqyG7PoI$+T5twO#1 zy`=Nx?frt7wC)$O&*dWnudvcjCh@4TUkKkP-(^aTb8&@h0^`YCp0*MEZfx{wN_B<& zhesubA<9VJbMTYiN9aA2>OA=~gBtZ%yvw8eW4FgN$?Ye+b$xbDnW-xZ_{->dewnsJ zRqw|Myu=8C(f$DoxpOC?lU#vsXMrft>hJojV&BTZ`2G+s>;{jiMT%ODkASWmt#W+7 z+IQ|;!MwuvfJ|7IEFn?4o%h@Nukrnmn|h>J zReFwKy$;b2Cq;jF{@yF&RV|w$4p$_9Mga2amVWiw2csz1&<81FJ_uz(Zt=9k;>%9W z{o3BepZMUsUMjtvm?htZ(3C=1C5`V0*@<02S)*gJo6>fHZL7S(Ncv(6uV-F!@Upm1 z&!bd7mA?rV;M?>zcHxXVFMBe)h#qcF*6fL&VbX7=fNd``jAPO&$>rAq9K$#6Tz=2! zl-CimG4{?MYCA7>nDaQs*eu!m#6f4$h2r`quO!bI>MJ1_lPR{su!H9VBodc#_}<)w zLqCrYQMpBq=kh*KxJ<&~nT58Pfcs}>cVR^}>lX=iD7|-e3gdYk#2NMaq4E7~A6{*# z6~Ja)K#zgF%}2OQ?$)R$kq2$MHCc;xF9oWDZGC7_ufIZmU#_Pey9=AuQk_^bnGT2h zyz@WI1nZ>FZWu;!+2 zNt2J1|FK5;gNEPSFPMNxWo~-Wl=fyt$G)~;Q@8vd;hNDDZ!aN(wQDTY22zGuB%!&C z2N@^~yL#v{xurzkE^Ld+W2fI%99XMd))x1)Q1oZzHjGC7XUDrN2_eNbChGMHIchsB z)p@rD3&575i-d;mjqijF1qyo{*5-aaD>%fSt9AyY>yGf(^VzAzG0d%i#QqYY^>@nQ z9VLEky;TSvhmJS~Wf?7WCSn;7T;rB}8Bw0+!_8svxALTivwoTZi@i#9>W z#LD@;>mV zWtQage5c0K79s{>zj0?OagY;*-a6q~cViveb*9XXQZ&;25cK#><^D!hX8e*(uaOkY z9(ZQDGY&d1-zS1Y=V+|uTIup0cOy)U!++*P_@n4)e&=8U-eZhpRJ68s^Y;G?pTs9cqt!wdZsNx zHd|i3OTB&{fg>)1F9OQMF9q+x&s;Qz)#GZ~_|Yo|suT041FY32&G}A26+~H$+wY{4 zfMU4RT)}5S+bfJ^zj0RuStBsnm;09f-vv-uEMB)X8oQ8r!e_(Oln=X?W_4-2c;~eiZ3Z8p8fmB9g@-PQ{IusyLsyTWlAXD8~ zuk_rBklne2;Ya6A_oDsHVTboJ3V+{tm?3G#hgH5J;nVnhs(t?6au~RlXDENf6`h|RWhX$h*T?Pw#IZTi-VjP^QIxb`ys;M@`l#vHO9%OJsTNvGG zo{KsY_%)O~k)w7dX>Zq8H;^a?b6~3B2evRrzW!y&eU4;L;VIRikYMf^9_LDU*>pIp z_hJ#53qBb1^X)hSJk#zw+E2^QCyHZhhMt^?;KD1+0VhEVy8!@BqR?-dNNp}W(~h+q@!<4Yy{VZ@Sk^mhvE+&n(q{( z9o%&91_?>rHES zfpZPIBsTm=$A=$c%+_odh@raO`*VsMufY{q#(ZfgtMK-cj<6#_Ly!LM6L^}ouPJ=k zftClA!xyIPZ)B|VOmMF#_laK!OX0-cP#Vt(iT#zZxk;pKj{MEj69=cfjMFnmCFG0_%J{TwBfD-NXfE<2CN|=hp<`P(Q zy&XF^k>Ey$=Co|Qe6~8Bs?LH^8m|UcvCYbqPqj^G)g9L6z?Dk*Qg|+K$2=q-$yL+& z_@@(@5mUM2GfR#i)cNLowqFE?77?+kZE?IEoLVqHg-0=#(7O|H1+=d;`5@wJzWmLM zJA0|zz5F+>T?1iG9gB+i(Rn~bOi&LEr85|Wdh+&U;}kV#O9MWegr3EZTyPATw2Z&D zbqT1f{RBfWx4^H0v`t5=qDr&dIy5E0;$SpbSEo z@?k&Yyh9*Euu9*STDU%rXxlBGNxF->SvT0+xUF&a*G^B(m1V9ZgLgIL5OO7@PjN8p zyn>v)oNnu-iHStVPx0aK#_`p`3@CuF_}{P2{Dz^i&{oL0q=3bN^++&4PgyGVsXjuF z{FWY*yce5`o6Q{GZ@7RFCpeX3q9YEHDhe4DVOz_^rTC17?MaW_Wgt&&!Oy^;wz3JI zdfRoj!070RVPa>eT%bFjCs%Lg!Bz8>`IDu(I$yWCQYg_3w{(8H%f^WT(u(bgWi~F! zS0i32TGrjs@mX*v4Y}LX+LZ5U`mUv8bQ7`vbNVMKn>32>moM zW%1OG#jfh=+anHH{8Q4jv$RN7u_f31qtyN{waVLfV$rB9RNajk(UCwLy%>}W!3f!$ z({w<$RTH_5&57 z8_lGOJ0oYF`BW{}MMk{hVQWOzwT4<&$PhJM_ffrsJn}KG%LIqc&e=7HSRNj9nP>EZXG~(DLbmVHZhWbl{m3d0KT`6L4%dsX3kHfrf@2S=x!eX&X z{`yu~j@b7KQi7QN_QkDAzm1cxW`0w6^zE;#J2qwYUoIDv}Smv&g0 zcrtq~2!ctEPUb=Q+Ya4{rhXp=E-m^@vA{)oeB~GN3t9W%WNs z-MxQmKtQ8DwL~LVIndXKfT`G4z8{wlo2gj{tf>g8QGzC?La+IG_wkO)mIRKLk!2R> z69+ErOG|k@KNL~EvwW-UW3R+hR?Mp>eIm5HD`QW8fBM%E={S|OG5uWJi+6%UDDvkV z@3}saB%y87mwM04rWRWZq=|96+M18qxU|~1ciV)~B&WL8oMJ@3hTX0UFEmXhZTP`^ zps|uSnJ=NJ@%#Odi^z?dwLk%C;r@w*5wVd7Q$5^tXx+lZSz4l#v;f9wqv-k5G5^Vz z(zhL`QofK+R_ve=Q@7Ys{Y+jnTuI%q_>cO$$asu;y)*4Oo+l@7xN2dDQk^DWKM)a7 z*JyY33o`!`#Y#^vDuRQM*zOvaXpu|$gWEIc$K5mBvChY;(h}^xnog;%l>Y#WoF|7n zW?DzLvVh>~1#coEBwBWJODRndN?iT$t}8wDrRW;Y)>Uzflin}Chx%847q*NiNkICB z@N#XSFZFq#cH|&PFUGK1i zl~GE1`WNI3YQ1{A{OO+$l*fd}fP9!#M+-h(!51@;FH7A`>IP70C_N5!IIo(3FO4{AU=LA7H~-lo!X zFpGV%%?x7COi#YbCkpi;v4;mO%G8X~YcLobkUfIicrCAfD@K3mqP}-ZNd8)&OIPf} zh=_;eF*1%Y?DT}c{mF`_eQmLPJ-)nQ`ku?=aW-cNJ2*nV@#xP-RB|d4*Wxdy)d*RH zKbo_`cjVWU7p?}2%|e=77(Fz{mh@UbYfuI*H2g5Xi`Gdd7A-wdBhlNHU(g2$sGOqR zJ&5XJ503nvR0nHBf{_EMPyshPO_U(#;Yl;_{wHeQI&aRu_gemLNeTeB z+0J)l)s+b@qC#0bCi(3iy%@K!t#GtOkxykIi?Y~Z=yHJpzU>QeFwq|# z+w)0i=s1lTKhg4ONY=7M1Sjyfy8dT_mpQ10@u|~1J)p?)OJGlfI-S2vGv|-qYot^!9YUhE>H$dL_-ef6iD1DxvO3M%h zPP3O-#+Gfm6RSE{6g3nb;2R{)QqnjN_fsYowMq^=wQOg4(F+_J(Sh395tguhgV_hnR)4| z{eT&L?K6X*YP_w;1(2Fv*P3mYXze6hmuc5mEH{Ol2P^UHPmrQ7JehWRq$}r!jyB+v zxT(f_?!(L>@+_i)>osSbp|2Vo5U@Q>g%uD>8N5E?!X(gC2m!E#JhD!Qd&gLFohn)g&o96@S1m{_u~ML zEh03wC#&SA6sbz?$SdS-<6fyANAMNI*c-gH`K*i}{Sl+pwXB9RJ6u3N%8!t}>6H*t ztMKJDyQ)2`B*3nS+S~6C)&Fzt=7XAItpD=4Pw<@pHqTI>n0;oLWGg<~13km3;wzJV zYxqXHwX61_)v;Fu2$X6eT4em1^Qv{%Om&0L%s31vdbeu1kpAf zlh$-TBY3ZdG?NKJ|05-}nZkOa{jq?m{QyRBUpZkUI8dqQStqjCGq2EjJ``Lfgg6X- zV9u&2hV#h5oM0sZuRVcp)Q;-^I2G?3a{OU>N+9jtIKncHH28rcifG>Ap5J766ksj~ z4#QO-4=C{<1(Yl@~R&rMq_P$Bg4aRl=hWEV73_k4$%haE+V zqAQ|;q=%FJ=bI?2r+p&C0_CV)CU%}@)uC%DL^S7PT23x9)uoW?9+PgY1SLnCwCiZj zeLDt(nQrtg0jK&C-r#>2dh572U;D}!>iw=IUV8mA{(juisg86}Wcs5=1!!Yqblk!N zmq|UgOVJ^LK7>;@QXU)^aQissgnynTIq^B(*DiUdKlNOukdB#sD0b-r?L9fE2Y(P+ zf~Vx8WOHZ%4DAQl!N?n<#F_MRF@-XML+Ug#qexPsmoNBNo^Kd?iQ=c`4^^A@kEU#gZe4b;xCmzb6-Q%2My1ZyTM=05Akj?#j* zdkPpbxoxqEBi-1z*uS2_|Jh;2!5IBj+fKZ1>eDD;kbB4|HN`1XS0cX&a(2cgINogp ziejQy%0}%Gv=RCzX@%Iuq>@Sk@UWzlxD3>AtE)(8nY^~9>C*Xp2-&9wyS{Sl9gRPP z0H!V#dd=$;xQ$TTC*~9~*@DlOe|de@-Xm)KMNQ2^(qr7Lgkwx}h|oKgU1JnD>;cKw z>7o)ZF~^0n7?|JAAVI+eq+Whg>wy_pft@_T`#ge3f4pdhopO*;@ruwzQRl13{hbHo zZ8pXcN`;(DLP>X&!KVuaJS5Lgu@yKl`58Hk5w2hhU&!AqR?RDnuFWshe}y@BS&1qs z>wINIVV|GmqEjbw#>%^?S(_NJrCh0wzNeM+cD9YCw@{8>`Q*&_> zx!x2qT$>NF{gj0UJtD^6+dk%baw%>U#UCI6I=cfp8@ojMvy*BR|7_rAa=xTHX7WzB zy-MWHtvq2YeQ|rjxcC+innK?$FftgjoolX1lQK!LEv1 zt7UPi$s|9c@O>4DxB)vg^4nOJw^F5DE|d3jQM=0z;=)h-usz(v_L4Qndw0NDAA+T+ z1>e&TIpYYmdn6hA5swz$kKGE`LMBto6uaBgO_V|vVK3(4C5pd+4R;qpOL|CRmrNf1 z>HDKB7ez5lj4UjoH&Lof~+J)673gvh+JR&hiZSI2t=+~4Vt7#nm^-dw@twuamqe>=oxLO*K z3b+;4#2EdE$RTKZ-Y3G+Nz^Q6Ue=V*ODKc5P_S`PSIvDKM`$bq((C(4s?;wg2Xoxc z-0`eaQkJiwOVsl|>wLy9hYouB`XD+ZBi<20AUL#$=Af==*t;{;UQDrLsSNEH2NT^M zau_%Bg3$*3g*U2ZI~gmN@2l8P3UCkdKF60pDnqK|G@ZAhz~LV2`nv8P3|_qAZa-kc zmlm#k$}oZZex9D`hjGL$t3B9Sk2YA<{^t`0Ri)k-oD24?m@Q9sS9~t78m~(>2XKpl zIWnNLX$z{XCN=QBh2_E+gxH2sVvd(*^i*u2?$V!AU^>p)26nyIln)73`d|L|NPBVx z39az6t92LoY;M;wT(Z`j&xR!i3IU#6u=+o&+QYDPn=3#e#oAN#i9BHY^wIRn$s}lj zIh&+P1sEW(CsaQ@QIE4&e|3)|aHZ`1;`PymI&xi)g@#(jcOLd(?5;9LUbUxw1BD~>DJjGE0s{|MFX93~WW{9kQT%+A$LpS8OU7O*U#V&HENIqm+uas8}?+3__ zCFUi=*beu*`MB9**7nMQ)Yp#GZ==5sXi0Fr*@oh z^T)<+;ON3zJA8b`KV~RBBKd)@mp@DNPxNzJy8~<}kUBVD0XlWF328G0Gs0UB;1esa zxZVxD&*+-jmm}q(h?b)g~Ffi)kd6-Zu9lLzSxXD{tf|~i zB-9-ll0}TQ8?K2HJGgkDIEd5V;rzkEuF6HHJ%s$WS-2nS^@h+2c``;;$!!sXR%TfZ zQnzT+3qM~Mo$cxw1mf;}7w-_8iz!I4eg#rY5EFn5GBwau+3i6X&MT=G%U!5>} z;EZ&|131rOLlOQzNU1xRG`5?+BA{0 zXcGPtkk`Ffmwmp(KeTZ~@4nAc<(*wn>NEBQy=GgmTMp)_*PVzErx*jdf{-<)0+oW9 zWY0dolFC!z4;vY{gqFj3O7f~C^qpAHVBp1#lbCQTQ(_gXTWImMoX~MhfDgl;y zn7m$iJd)^8lF#P$XY?!#;*ABhOmlxObhR3s^%H#;s!}8?XuLTR1MC(xe+rrmWAJz?kA#^TTd4NbrY$f9^z@**&H+0v}ky zJqTI%GN1B^Zt&9l2zJixl#VaMZ<>%15eh`Oc?8+zklDB}sRWp>{b4~)$+h8wRkpZ( z+3j|Y(~R`H0pe#QKB-lz5SCD$t`r`!whgLUV?1(P?Q z2=XBSpU|eRUcU=QYAPtCK-|^v(tH&b=~8{gF!a({`vL1DoqNR!D-gS%ttj1g_}wG) z9EPWud2bxE!U4{|x8edhV9G^Xy>EvF%v&wlhfVABF?v{yN(0}CvoROHJ|bB@9%nqK z6y2uG2oY<*XsFkt38{!w^6Ta%aikvV7ODKer^C)V_k3_K{=b1vp-a%>5h z%w#R-bj}-USz4ftn$K1wbuFtCuFMK!Uu}+9a#c?rTlscppJBIZQtpwk#j1ODoDIIN z*`Upii(t)KK?en6A^{`Y*j~NE)QmS$C69OVZngk4D=$svY@4Np0Z)crPXPvd)e3<2O%>CT= zF4x}s+B?sk8DK&cpLoCi^IYw)YXc#4$Ci8;L%ioZ)1A<;=7a4aJl`rnsBHC;OGd(r z4O)c7{wJ9&g}_Peo|W=Gm?yhon|e&Bp2TAGoic^};)*RFPo4ohce`|OQ3o_o`<8N( zY>`jTMn(TF-7ZouI=N=q?F0aArQ&{ZrIvQhO9v%S^^E^DkefaJS-sclS3Y>Y&cvGd zq4LCQ^v`tLHuy|78qKh6ax;eA3T+$WhD|SJq!Cf*YTgG9as>@)KdY|9TQM1M{)3O89Jo;p=gkCmUjP zDj3@_hUM%66M#FdU{v7+)R@EC2|5}Hn*j~M;wLm@@)JDLfXrkVg2V4 z-m73lMSjco>vxVm(KugT7`rKBVrlrxB!RJxU{jzV43^Z}LKl%Kmf_ckRZ4Z71wb3$PD(~DGJEm3)e{~_JVoHr6xPJ+scR?uT%ESGU zF}UWlCl;lqEF!Z{JXsb_e00PK1J@>@Rk(+iq;RI1nwVj3pgB45HIP9s`k$dD>>B;{ zLcaOb%*_-PyBk8^K{CXJzZ~4Zzi)le#+_|u1u(|m@CB^C81m_``xESv@ss7H=3?)S zbK!m1cc2kg2NYO08%UyiS_5Q1A)dh?k?_Za28Z__{%tt}A71<)l|bnUDGZ#hxDa0( zNu94?HA#l$lZM|nVI>xo_xHX3erb5SlQCeHAu7MP=rnIc9j^64$w$S;=NZr|d&Unj~_Fcbhud2dR6@D?l zy`T^u(U5Yi=KuHgpq;}j0Fhfw@nv|RpJt}oI4WY7)M-OGNKZyNdXheOva`Jy6+L=k2TZ8b6-H zc7j`+^Md&&!iH-nOKTQBb&kL2uwVGsjg=&AUlTkr9^jBBfx)+>1!b6YG+t+wspWju{N-{I;?=;_94a)PfSWS86B-B+Ve@wG`u>LmrfO&hf*?pzO@ zl*QgK(k>OjgxzOMi53i@V`aFNixhE80$rA~NE>t!C`^#G8wVLowlP2WoU)w1F|u+L z{~BA6@m!=g?qOQF5q^!~_G}C$%;xN@NLR?Du}{;;W^eg&5wV;eg@_Hb_a9FGIbK|x zt7>(L@>|R;BOSHbV7>wj)qJsfudnPIs%iWdk zTPqHWc6gM$xuxw$G<}-i^TG38^L*JTkB0M~7}?`~Gt`Epv=jSf^MS=$zMik)9Kk>g zgTYk)H6Z3_L~6fC3<(jQCCh5Z4)KSQmziXtK;p$K7BZ1ag@(7d$vo7|F#PDLBEnBc zu}Fm{3Zs=*UE4N@U>wu`T*SENPn!6oweE8aFB@Hx)05gN((&$o633T2f^qX}8^LHl zW`_RBYK!@XO}X_r>J+~aO{@#Jd`o(#&2zi+17ufc7YwHB@AU+X%`;Rynz|a}O?E$d zbzm>YnG&Yx_YGDl&S#b~4s>#)P5C3Z&ghm`XK6-!Uh6*be|&aFDk>{wO%)ZZs)3r- zLCq6Cs)#(jqoUt%TSLOAHt+=E(??XB4{X2jC^}D1leH9MdlbJxUpF01J%WF2aq*Qz zWK~O5#w#|`;(@_94hoNy*#;5{qch>9pGOkwDiX`BKbREe9$Lf^X$}v$Ju#Iu%J$m< zWD-^r|9ax=?DfL93$xwa{#zJK!BOE!7-;Gv?(0@9$8h?TXig8@%UNKsp1>S-GZ3>( z&sAj2aAk?9X_wtP;;x>GGT}2?_j!iL+AIIW3y`Sex1>QJdtsTLVM9aMhGIc%+iB0b znw?n32>MjfNuho4lDL(vRy)7^MxuTg*<3m>-zwrbP_nExg`r`wpxfE?APU9vBoI^r zY-2})a2uP_MROjmBQVLtTWRC4lW<;jF;n_c*5#TE$x2)}**6m|jE03oBP&55>>D!K zWA9q`fzjT5B~k0=Z@=g%7M4Al>VG#rW6^HCqsvV^6bcBlKweav0*! zt-wg}g8S&$h=QBlr0)WR?QiofVdY89(Pkor2G-yxS^ORN47;U8d3!nSjaYzzx~;?z0vRvjwSra3KQ z{pU!NMn2Yvbd-;v1izmZ5wqAdvRBOV%Xh&oo*s>|*0MWe)n|Or^a$*r_5`?dV31%0 zBkAsd_{IbsWo1?@Jb&pAm+uB&LN=J^hn^(~PQhC&B~J6Fa02Vliu;#dNfelKs!GwH zI4vJa+>vraB*GxPOV#MmqJrze4iD>X!}c~LFCt%*&Ulcltg(&xS@zuQu8HgP>cN+C zmY-Cv@qayqE>w|H!w1GYWUjSoM7MMHh=x_8JMr^f6wun;8_u__HjCM)*oY=@{bUu z=v*u@t~lV$O=-uQO3~nl0`Q{^iXNOdvGBAfU?$A|eolWPcbV81%f0=wuxnRR$@w`x zz}UCz>7unFF2T(M;$=1@Md$T$LX6Q27b&TeF%;|C+$lTv64(EUBR$E>J#?2MsOBx( z(rR>APt&I{?&Y%ELU_9P+U)_gVB?g!E2KY5)0yl^UcB7gCmj0>KMSX;v5oc$kf!X` zA@Ihct!P7qj>el0a*KPmn}q-r$s7PE5;N75Bg>Z4Xe$jG+k=${#CAG?`+}u)$z@Zs zjjTth@P1x{!B#aBub?xCniHShn`}+0j~2fg_H7Q9^*^6&HRjPDRjxx z7s1r70S8DZNAU`*Khu3T{#4^Ejqs{nD4Q`Q4gKH}2J#l|1L^wi55+E9^_S*@W8_sV zyyfYoGt*+Y4mf`bl1B8gH(sIN2#*r?4pX`>u3Srt7RQK{T>->ghyrWCggM)Vt?n|H zm$l;aezY+cid*+}QNj6T6kK1K%9gW7HrsGR06w~rs93uqYfgYUEvzk zX=+OJc?oNO=`jSE*6hYQN>T-VIC8%If_z|VB6kb@-Z2RipZIfgrw|>uT2Rzh54cD} zoWCt%8Y#ZY%6?!tk3?njs@*{v7)#ZyA(*d|sp+B{`Q^C$-PnI#sDKIv?kTuEZ3zY? z>`yBGO2!`Eg>_tKzBR06l2_^{p!o?1ru43us`Mb@vSa-r=Qa(cSKUP z@R%G0*KOZIenF!n0R6PU1RmgRh79|a{{GHqmbNK}Gv@0;+`3gt1z)T23>A~p@}oo@ zF`M0$!BiUKIgIcojrr`DUIHsyEp{;eg5{o}DV%(?_`}6Ia>q%~=u{-CI(pBfpm-gD z$R81^!*LY6FbY~8uK?0b8NeHlhm(L@4D@R-;!{qD7qWF3WJF=2IyHn1CG_4XTtAj z-Djx{!S@^lMIurUvG2E3RX}k&9XzHqk13!C0GGCLmQ0A%`&f-JK?fUcmx^tw{XrLt z@vuFA)(GaoP>PxytJSK{UzooA0l{onHd=@50dz@RvZmRXVrnZE+hM~$XIn+Sx*yp$ z`lwZ_qY0l+AK@LUSio|YUgI2MxOAdk0{3tx$-q!2-j zAe~e8s+Wbxa_7jxP^-w!SAY|bB82W(A1SWvYZTNFoVE3&OD@xEj2BH2_^QQ*rY3Wj zh@N|r+~YK|rhKo)X;+Ox7(5oIH8e~lQMn^vHU$@iTK$#0_+6!i`cu|owhti+<6lP$ z8Mxj*mB1>)lp@7zQ`$J1Gy$En^vZZBEmMB(1d>!Qmvny+3@e}M)#B6nO*ab#NL?LK z`uY|7Au$yXYQreRLOia-0=OhD!A+tY0mYSH|K*ih?M(^OLeZEQ9Y-)0W)?H|$EW?e zbAQu9X-K{izX4~lG3v#r#>BqJX+yD{BajXhTnp90*X~u46y^+Zr$LK-JfW(BLm<*_ zcLi@sBat9W+E{g&5+-tZCpL`J#_6OAdMXwq5gip)ceK2-tF_IZ6t|FiP&&O$l;hnYk z{97YDQ>p+GSIQq%p3PU&MfZHpQCR4mOCb#f$fqmJ2?kx$MIqSzKDTP4vX@c7{PI`G z8N@|u_bYn5GIh%Bd>mk);g!qACqSvj2{uO-$Q6Z5ns>6vbCvo~nnN1*NvqZxyeupF zzW7Vk+^CvEhQm9##OxUcEV>(Vzowo6VPZ4G37#I=ys?Oz`RMxh!>4@)M>f0t%s}xM zDR*{3QjHP)7O~AV;v;9FVu6eV86s|m!`+(=0Sq^!0TvW=lG-_j;f{rI_@UtfT)xyV zFEJ3x7o4Kpm4dl_epcl6C@+}Uf=#*9EFRsyQS2#NEzcr?^Lk&T^(*674^jj>5V&0| z+mPIiF^m*0Ed@)<#8g5Kvfa%!+fm|&E@`G#n4&onh2HH!lwAwiqrv>3(95s>N>Am4 zev_<+uis0)FJ60%6YPx0zb&6<$#R#)GgSIFvJDZ2jt^(-g&9AXjKqS9qx zGCRtvvidsQp;!e;uqs%tuYH_dnKlSKQXF8&=&{h_j4JL>en94+@M#C~Z5P%lEYyxv zA0=LR7ae$%E*&jQ3>X_H&TvBJSs zFyXRu%_#mVWpmsmQkixrCF-TUg)saHpZD*t=Os?1PZha?-RV;W%|tzb5sabiTzTt0 zjgM?OEl}!ly-tqrfm+=otR2~7kJE1`ytXkA+xhoaHi?kv9PCi3Xed7?IwacR-ey$D zoEX8?Tzs(ugZZW>&jCM&D#wk|G)4@->>Lt+YjJ-g%{+s(S?DpoC@AztVXKJv%XP%% zXQ=(~+rhkr6QI=aotFozu4m8FAa$=Y?k(f9BEwETM7ifc~Td% zco`w&qA>>H-H_xdH7X{!+YXS2NJ8cj$GTm-wZn6RNS-k}&|Isdwm&5~c@fvvVjH&iU3 zt^0WYis9y_(fPvG<0V~bQR2$)7~4Z~X6Eb9oZ-(2mGnRsMdeBDlX7!jMEe+S*~^E1 z%~vLdK6D052vSizRR|be=0f}|ft2u)p_t=N2qq?l+&>8fdy**@>y&}cKg9JD@b!+q z*27dcs40C(GxDSt+%FxTa}dRDxN`;1dDVI>t8`!YgcxLzoPDq}9gWIIJ1?|{HWu%m z`O~UpX5?w!KUGges>`clc<2+|CGe9Z6T48(7r<`GQkpan?xSpDULdl%o2?Cp6b$3{_8 zIVe!PjC}-!S+^~Hh>LMi&Bf>08NxE}qG#f&CQBMEjx?_&#~L&UcU%jHz5kvw>|DN8 z0pUKw)!2|A5*zy&HwJ@&|8}VC5D06Fin&wMWhnkv$ebt@n!msZ45wmzWG^!dl}g}7tL8qj ztZ4Ze&jGk}uxK|mZ{Lz$*YxrC4Q9TxdOsV9o>Ew+8`v0bDLO_&$5PYl+@a}Sf-X}@ zOIMK^BEN{pQ#;zh@M)Pf#inpCk!Iu$^@w0TxA>mlq#SAiigf`z0ciM@#N2P??09|e zHcm^6m39FzU95W(X{HR97RAzAShA-<+WC6-9y*swzeiw8VqI=m18X62SQ`5|dz6=r zBx~X8HwIZCH94r@Li=~v3WDNMG}VHX)>Qm_JU&K8Cr`0Ik5_%5WtUfDP2)du27RwI zqaZb@{Wsk7KffG}ckSSB4duhe8$f+zcHnKm+sow@DV^avWRDG(y!aTP3^W!RaFw(a zf~>^4<_>OEU5Y$YO&p(c$u!SHbRJuQ2g5pX`gA8J?;545}n#mLb<3)|` zvEIdx5Qh`q{D|T$*WuzJcE}jw<_eA9r1j^b@{!`j;v}jQY3UkiiO3-8O%nMT*SfeZ zv(2p{8ohRExgQs92(cuAbC#58F2s^SW4Eh7NY$5xty2y)s`{I`^5p$~LZi9ng-JYK ztoA%raD=F*g0H_l_ZSyyPLkM(<(|!D%r728YM>-;_1Ac>1ezBC`zp%*5`C9Y%6nt= zmCDcxmJZ~MK=02I$;8cFCIx4q5Lz-L#b20R;U}Q;-ROKH&fzq_h_1IG{+iBY8LwJ_ zr3K_f?I03Vi1wAirR3qA{q_3}W1Ui?UJyw%z9->=`UZE7+Adw7nR96mo}gQgQ6u!JCy-9uTn{=ANPUs=uRe)XZ{8k#p?!y1Zuk-GW=xpf zQ{X?b)ynwVWBm>!qoA=xVLGP3xuV;!4RG;Urc1!-h0g4;jMj^uu18vj*Ja1bN*g`D zx=Zt2AaenDE{*rW$f7w?lO@FB!gSG1egSb>!TeXeR2!8g$VlDqGRf9+GxfyfJajn& z?K@BEfAMFH1UmK(t#BY!m7#rhq|i8SD7j(rw((X{)SlfwT6&MTw_EqQaNprp3aG0XGuUCM-y8{c#?*{2`wA$7MV0vWoEt=>q_DR zKkHsL7*naja?2iz#7&O!e8tGt+3okcq@^K^fkgZ01x_$!#A&W`N~iPedzo#L|Q7v+2x>v zR(vI%We5VKrD%?czPgz?B-z?R_H!x|WEi#sR~|^x&1L3GV_o8xdK9MD zT?sS!(Ptc^sPV;hdDG9@_Hn|6_DR_}cZ5w9JY~*l+Hp2kIUw~oe|IFjzL~8L7fQ}s zR#(U%L0-sYF4~AJUO@z23v4fH-E^H5@9KgDGi;t1zS zopM^5tYM4E;mNOc4kW5AgB2oS%>NfBamP0lgVDGt56^mHO9=o{!;6r z=Tvm;F)_pmxNEs=`I1nTwq`Toj&&~0G>qMD?j|l9A&nOKhj{PSXSEmC06U^_RE1Sa z#%mr8FhrEt&BQ)+{A**5THECeP4jjuVu&`YzBKodJxM_1i&_0NVHW{6BV%qBa>mG~ zVMJjA)speNMJ4@4fgUHg8~w3pmtN$4eNZ(wI(Td>Utr$;l$h6447Z8p_2rxRm@&?C zQgMOi!@Su1KSmF>m4CS^R#~m#pp{ukPBvPFDR>zda%rdIA&S6+G;?c@@?SwOqfGfM zG{6F}h_;n{-iD4{Cx*y3N^awThXrk$JOxA`&`$KngFeSZ{;nZy85s*2l54)M2?>zT z1xA|STz2R8>=i}7mIdZQW4eA*?*LJ%G@y!!>cwygvRXyVe5u55XHb;voajXPIHDkG z*URaQ62B^6snbT;=olQL0TlJX9pm5L=36@@SLi_*t1D#K>d8;0iuy0o4V($ts6B@> ziN%hzSmw$Ak`m&FVuO)UIi=dSW4v*TlWo$HDb5k!LSH4S{B!{ZszpnOwbeZTLiQSD$_6?De zdih@om7KpRX^Bb-4kb0CBi5vFi*_|+(I0VWQf<@&dRke+%lP>bvmwjMQmTLiK3Tqi zo1@X?au)4KOXo;cd8ibLB&m5M6XlUe5KW#QSokK;P8aktCj}Fh&tT@Wiy0zc zd7q$m!8%=pg!GOOcZ-P20<>V+hBPxsnn?gekGWw`UfoPIU292*qXB_6h^ zs!q<@6GCP9K6Q(+P2;}R*UHaDWmK11Dhv^({9GI^GtZt@KD~0lW_%Dt^lz!0|2f8r z1ZMpER-&GeIKn80dLCHi9xq`yFzm?jnwe+eG)bW2!%aVa@JZR7N9YEES@ zo*1`1HC`2dWQ51Q(B4gy(!+0ny?Q|{VUxjR=b?wbj5g_0FCb$1_NC})P4d4$Tw=V} z0`DtZz9h*nxa)a_k8ClM=spJ$OOe*azuV4)FG9&7PZbQKV_0IyWw6l)ZOG!Nkmjka z^!E{ST!4BUGWi|CwF=Cg@5alWOLX+?>*MTzidSul*DB)2awQ(dVpqjIVX}?**ITuK z9rZVZMxfqg6e^Ku+XhC)!`oe~aG3rJubQ-z>#mgbP~`o3hz%S_mMS$f5S3{meWUaU8215z0P z-@YrL3H|U}33NZ8`Dd$!-=OevEFth>P8-lSJd7|_IV-69mddj-p@C8sW1o0=+-tL% zQ6Qp2rlxNx3l0>r7OyKPf_D08f-Za=nnVw{FnAVnvnH}_@3l=#h@{+gq#)-HkSWDmM`Z9ltlP3 z*!)6D9QRY}zR#PhikK#ut4f-EV{BD`E%Eb5$P1CTZv1@6TOJwNEJLNq`};sshJ0Oi zgh!Lrx&+Y<<0vImfi1270oTxQI85K$4xxeC3)+CB$MvUh-?my=X1F0bAym(`K~!+4 z?vc$&jx%#JT?cYsRaD|w&guGK14*W^5s`|8NL<=ZFuM;)6~YV+<5zcu^R*56F`}T* zaG&0w=h;#BvOAtT$MHBn)-Xo?K7zA|ZdujiITJjq9b-!n`dC3XY$$GU;ma3=q{#-{ zc16N*;HEl-_`& ztp?A^cETzEo0#}Y0yD~UQ#F~_f(Cs_Up0=<%7O0HYR4EVFdn=#Ze*)fmnAra6D>^- z^w*>$>(9ONMuqt=lWpqLj|+v#0QVwZh#QhA3oI=Zy^b4!P(^Ur8~UP+`PDDab=e2T z=wvcO11Ourv_^QkoTX%(lIe%^>4I}DMtl#>gbRL8Ws+)2M0F0+OA71KLlwN>EY0GS zjGR{O`iAh9Pk@yGNd?=jod+A6k_g}j6Yc4*PkQ@(7@~K`1^o>xm;ajGIGZ!;bTDKI zzCkIaYI#q!82R+`G>&*QS1iOML2igrB)B2URBBKsjjN>>fvt=~c?MH>9IwXWFO6HB zzTH$)HQ86@EnIPow*d*VK}ub$qu=pu6S4}X+Bg#{qTb#=<@`wuq}MsUPNDsZ$uKG7BfH%z76>aLJuf$?Z@g4;%vF}|gVuLUSh z!syG}8J}+^J^{!AP4FhYt~N56&b47KJV*I+$M+=HX`;^P<&qu%InO>gP2@a+OTCcpf zO>}K|xebzWzj&N~5RK4%A+5QMvx6q=9h~_+d)>tyd%W{z^Aa|$!(ePo2E@YhQ6}LL zHz}qvl(Jo;kF2UoT)M#tu7mA^483?fP5C(nPI^~LIF{y*$U_&8CWr-I=^Sm+DwnWu z8y9WDe~i;Tx}7;*0owGL1m2?cVp%X0cMNtxT8la>(z)U&OCHEm15Pl^M5wc5)KV-! zDK@9z={G)bI%xtJp*+Cy2V=R~()7IBqb}b9d4`?SZ#AFC+d8XXzfV z`YL5FFM(J6gqgPWO`1oE63dF7Cj(vonqnqfI@wjFBG8LgqtSLDSK_UT#s{&O$`E1t zAWX3_v{STDWtOJgT=juvg=R=|O!$h~cl964V*Jzp^()6{+u#^M5xsywYzNE`o6kga*5JxX>~~92j5N)0dvqmN56S8dY^4 z&cPhQWy)TRryVUc=*Yv#eMG(8nkJgfCyDk6StHYG9FK;kz1dk}WD2z1a~J1Zaf~zW zj79{4>k5bCrO`?b_^xu3%7CS)2KrG>II!^*Rb|_fMLh@(MqMRBExRmaY~G6Fc6T8;t#VnsOB!>{oN0Ww?3sG{ux}x)E$7v zZ^gnrTt13g$orp0cF6kw6(nyP9uZS1&w^o)`PPd^k8*;okWM*&58+VHE@CR3Yp;Jp zv9207jGLRmNvn!Pw2O*)neu<40T&oq>HXW%F3Q-YadU8KXZUwvV!>OAcax{5#G+ZW zb5yYoN@skUx-Jw^{gG0ff0~mfAmZl;6%6wUGrw7#_&Jv}6NY2AP|~@c`Zun+!O)8~ zOFm|?Z;YXgvH6<{*U1v~>`Am{i_;q=?yoD*9_8btiToZ;@W6<2uU7UE1_aJ|6tCi- z<#`6X+kL?{j;k3{**`Ds337<#=Ad}Fw!+zOIEiStWTuBH<4--uA& zCuNfH)%FS8b62Bg+k2C_X2g&eOoASMBL>sRXD=^Lu7pt5V76zVym;;?5oXBrZVW24 zr{ad?=WG#ZRCUIXF^wgO@U94B+1ugrS@440Q3R&JB@WFg)Lr@g)mB7Dt8G(j`dhig z6kU3YArzs;PknjM+R0tZ{ODEVEnP9(e~jBo^isHc#(%_Rp+Gt45>ur+y*)?27`Kh| z)dY-8{ClBY0_QKtd-`cFXNhe9@ZaSJ@V~JrQDN#PF4`1|TN-xv-`W$6>dv44!G$J{ zW;Jct7KAAi7RU_tP`$jragK6@VyFC^F+w=S&*D`FcuTE8(K@x*q11$|F3+bExlDz& zKW_G$^0j_j<@X6)oKC<++f}70YqTo#CcEZN??4uZ+ZRr9s=WR_sBwnG(S^&OCYyXV zeAywVrN*k~jjX2#$K-@91B_%k%6mBaq_qywQDzapQ@%bfQ)#1IkBA9UX}k3dx>AhC zS(tVQGrs%o+{7iIigMc~Fw>TmDU zPYI*qL_XEi0h9VC62~G#J!yN@~2D1z_pW%4KG4d zT>oJ|_52r8Af8Q>%akj3Kmy5$7)ri7dw9CqIIU=h>|8|qf?5pc@}~fAz}8D}S+;FMa>m?j~t;tdo3j#x{|wWHAXK6Dy-% zScQ%qo;!U!XoZ?wZgRCRezdH+-PHm#jQNIx?YfX(=r3pBcnX9IB*s4|jW1$e9%m z^KmQGnPHuKf`LOp9814Lqab5`FIvRuRq8P3Cy!k-;kd& zdK_&8nj!elwhZnI<5T9d0PpgUUlov`L1JwB5Ic*PV-Xyx`kiO+2U!orDx)l`#2YE+ z1hs-CQ{M^g&s1MV#EH_NiDq@V;FWPk`}kYjigw$5MABliQ@;E#i+cFos)A!bn`+PMSPSxeZ`F5m`xP}f*QfS{BSav00Jlvy z(R#0t8rIRHVh1fISN6BfeOvbZv{c`4J%6d5wd~t{8E^3Ot8`j^AD^vxnQEUnnoxeY zO=VhQvg7r0_3X(w8k?dZ6+fyr-i34Ut#y!&84ZM2P}_?wQdO~+#6m(VUl1l)KbEF$ zi`uVDiiGy9^xLI7*7uUyw*Ut_C~3^ndg zJJDeLv<#c_$@c(6A50ffXb!>;6GnS5VJYhMvGV`<3kXn_|NTFKT#@;|_2k+QHm6>3PID|$mi2Z0O~wDLI9FES~jCKZdQNH0^8lo-O0 zj9F;yG#iXRUp^CtxCS6&Bty#jciO=tLYRd_FgQd4tA%WprE~=l#yDBltvQ=Z!h5B3 z-cQhS2?GARV1?d04<``-E#1OKGN9lz>YU3j+8(p_99>vwGr4gxO}PY`kHV@ --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -141,11 +141,11 @@ Whilst the default requirements set within the pipeline will hopefully work for For example, if the nf-core/rnaseq pipeline is failing after multiple re-submissions of the `STAR_ALIGN` process due to an exit code of `137` this would indicate that there is an out of memory issue: ```console -[62/149eb0] NOTE: Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) -Error executing process > 'RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' +[62/149eb0] NOTE: Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) -- Execution is retried (1) +Error executing process > 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)' Caused by: - Process `RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) + Process `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN (WT_REP1)` terminated with an error exit status (137) Command executed: STAR \ @@ -169,17 +169,24 @@ Work dir: Tip: you can replicate the issue by changing to the process work dir and entering the command `bash .command.run` ``` -To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so based on the search results the file we want is `modules/nf-core/software/star/align/main.nf`. If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. Providing you haven't set any other standard nf-core parameters to __cap__ the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. +To bypass this error you would need to find exactly which resources are set by the `STAR_ALIGN` process. The quickest way is to search for `process STAR_ALIGN` in the [nf-core/rnaseq Github repo](https://github.com/nf-core/rnaseq/search?q=process+STAR_ALIGN). +We have standardised the structure of Nextflow DSL2 pipelines such that all module files will be present in the `modules/` directory and so, based on the search results, the file we want is `modules/nf-core/software/star/align/main.nf`. +If you click on the link to that file you will notice that there is a `label` directive at the top of the module that is set to [`label process_high`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/modules/nf-core/software/star/align/main.nf#L9). +The [Nextflow `label`](https://www.nextflow.io/docs/latest/process.html#label) directive allows us to organise workflow processes in separate groups which can be referenced in a configuration file to select and configure subset of processes having similar computing requirements. +The default values for the `process_high` label are set in the pipeline's [`base.config`](https://github.com/nf-core/rnaseq/blob/4c27ef5610c87db00c3c5a3eed10b1d161abf575/conf/base.config#L33-L37) which in this case is defined as 72GB. +Providing you haven't set any other standard nf-core parameters to **cap** the [maximum resources](https://nf-co.re/usage/configuration#max-resources) used by the pipeline then we can try and bypass the `STAR_ALIGN` process failure by creating a custom config file that sets at least 72GB of memory, in this case increased to 100GB. +The custom config below can then be provided to the pipeline via the [`-c`](#-c) parameter as highlighted in previous sections. ```nextflow process { - withName: STAR_ALIGN { + withName: 'NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN' { memory = 100.GB } } ``` -> **NB:** We specify just the process name i.e. `STAR_ALIGN` in the config file and not the full task name string that is printed to screen in the error message or on the terminal whilst the pipeline is running i.e. `RNASEQ:ALIGN_STAR:STAR_ALIGN`. You may get a warning suggesting that the process selector isn't recognised but you can ignore that if the process name has been specified correctly. This is something that needs to be fixed upstream in core Nextflow. +> **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. ### Updating containers diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 40ab65f2..b3d092f8 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -27,7 +27,7 @@ class NfcoreSchema { /* groovylint-disable-next-line UnusedPrivateMethodParameter */ public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Check for nextflow core params and unexpected params def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') @@ -135,7 +135,7 @@ class NfcoreSchema { } } - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Validate parameters against the schema InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) diff --git a/lib/Utils.groovy b/lib/Utils.groovy index 1b88aec0..28567bd7 100755 --- a/lib/Utils.groovy +++ b/lib/Utils.groovy @@ -29,12 +29,12 @@ class Utils { conda_check_failed |= !(channels.indexOf('bioconda') < channels.indexOf('defaults')) if (conda_check_failed) { - log.warn "=============================================================================\n" + + log.warn "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " There is a problem with your Conda configuration!\n\n" + " You will need to set-up the conda-forge and bioconda channels correctly.\n" + " Please refer to https://bioconda.github.io/user/install.html#set-up-channels\n" + " NB: The order of the channels matters!\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" } } } diff --git a/lib/WorkflowNanoseq.groovy b/lib/WorkflowNanoseq.groovy index f946bfd5..25a920e9 100755 --- a/lib/WorkflowNanoseq.groovy +++ b/lib/WorkflowNanoseq.groovy @@ -48,11 +48,11 @@ class WorkflowNanoseq { // private static void genomeExistsError(params, log) { if (params.genomes && params.genome && !params.genomes.containsKey(params.genome)) { - log.error "=============================================================================\n" + + log.error "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n" + " Genome '${params.genome}' not found in any config files provided to the pipeline.\n" + " Currently, the available genome keys are:\n" + " ${params.genomes.keySet().join(", ")}\n" + - "===================================================================================" + "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" System.exit(1) } } diff --git a/main.nf b/main.nf index 16aaed0d..afc83081 100644 --- a/main.nf +++ b/main.nf @@ -1,8 +1,8 @@ #!/usr/bin/env nextflow /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/nanoseq -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Github : https://github.com/nf-core/nanoseq Website: https://nf-co.re/nanoseq Slack : https://nfcore.slack.com/channels/nanoseq @@ -12,25 +12,25 @@ nextflow.enable.dsl = 2 /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GENOME PARAMETER VALUES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ params.fasta = WorkflowMain.getGenomeAttribute(params, 'fasta') /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE & PRINT PARAMETER SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ WorkflowMain.initialise(workflow, params, log) /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ NAMED WORKFLOW FOR PIPELINE -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ include { NANOSEQ } from './workflows/nanoseq' @@ -43,9 +43,9 @@ workflow NFCORE_NANOSEQ { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN ALL WORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -57,7 +57,7 @@ workflow { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ diff --git a/nextflow.config b/nextflow.config index 138cea32..7ed2e5c3 100644 --- a/nextflow.config +++ b/nextflow.config @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ nf-core/nanoseq Nextflow config file -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Default config options for all compute environments ---------------------------------------------------------------------------------------- */ @@ -24,8 +24,9 @@ params { max_multiqc_email_size = '25.MB' // Boilerplate options - outdir = './results' + outdir = null tracedir = "${params.outdir}/pipeline_info" + publish_dir_mode = 'copy' email = null email_on_fail = null plaintext_email = false @@ -62,6 +63,15 @@ try { System.err.println("WARNING: Could not load nf-core/config profiles: ${params.custom_config_base}/nfcore_custom.config") } +// Load nf-core/nanoseq custom profiles from different institutions. +// Warning: Uncomment only if a pipeline-specific instititutional config already exists on nf-core/configs! +// try { +// includeConfig "${params.custom_config_base}/pipeline/nanoseq.config" +// } catch (Exception e) { +// System.err.println("WARNING: Could not load nf-core/config/nanoseq profiles: ${params.custom_config_base}/pipeline/nanoseq.config") +// } + + profiles { debug { process.beforeScript = 'echo $HOSTNAME' } conda { @@ -121,7 +131,7 @@ if (!params.igenomes_ignore) { } // Export these variables to prevent local Python/R libraries from conflicting with those in the container -// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. +// The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. env { diff --git a/nextflow_schema.json b/nextflow_schema.json index 0e2e2c61..c0030cf7 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -11,7 +11,8 @@ "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", "required": [ - "input" + "input", + "outdir" ], "properties": { "input": { @@ -26,8 +27,8 @@ }, "outdir": { "type": "string", - "description": "Path to the output directory where the results will be saved.", - "default": "./results", + "format": "directory-path", + "description": "The output directory where the results will be saved. You have to use absolute paths to storage on Cloud infrastructure.", "fa_icon": "fas fa-folder-open" }, "email": { @@ -178,6 +179,22 @@ "fa_icon": "fas fa-question-circle", "hidden": true }, + "publish_dir_mode": { + "type": "string", + "default": "copy", + "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" + ], + "hidden": true + }, "email_on_fail": { "type": "string", "description": "Email address for completion summary, only when pipeline fails.", diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index cddcbb3c..0aecf87f 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -12,7 +12,7 @@ workflow INPUT_CHECK { SAMPLESHEET_CHECK ( samplesheet ) .csv .splitCsv ( header:true, sep:',' ) - .map { create_fastq_channels(it) } + .map { create_fastq_channel(it) } .set { reads } emit: @@ -21,22 +21,24 @@ workflow INPUT_CHECK { } // Function to get list of [ meta, [ fastq_1, fastq_2 ] ] -def create_fastq_channels(LinkedHashMap row) { +def create_fastq_channel(LinkedHashMap row) { + // create meta map def meta = [:] - meta.id = row.sample - meta.single_end = row.single_end.toBoolean() + meta.id = row.sample + meta.single_end = row.single_end.toBoolean() - def array = [] + // add path(s) of the fastq file(s) to the meta map + def fastq_meta = [] if (!file(row.fastq_1).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 1 FastQ file does not exist!\n${row.fastq_1}" } if (meta.single_end) { - array = [ meta, [ file(row.fastq_1) ] ] + fastq_meta = [ meta, [ file(row.fastq_1) ] ] } else { if (!file(row.fastq_2).exists()) { exit 1, "ERROR: Please check input samplesheet -> Read 2 FastQ file does not exist!\n${row.fastq_2}" } - array = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] + fastq_meta = [ meta, [ file(row.fastq_1), file(row.fastq_2) ] ] } - return array + return fastq_meta } diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 45698688..a9d9fd67 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -1,7 +1,7 @@ /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ VALIDATE INPUTS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ def summary_params = NfcoreSchema.paramsSummaryMap(workflow, params) @@ -18,18 +18,18 @@ for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ CONFIG FILES -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT LOCAL MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -38,9 +38,9 @@ ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multi include { INPUT_CHECK } from '../subworkflows/local/input_check' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ IMPORT NF-CORE MODULES/SUBWORKFLOWS -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // @@ -51,9 +51,9 @@ include { MULTIQC } from '../modules/nf-core/modules/multiqc include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ RUN MAIN WORKFLOW -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ // Info required for completion email and summary @@ -104,9 +104,9 @@ workflow NANOSEQ { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ COMPLETION EMAIL AND SUMMARY -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ workflow.onComplete { @@ -117,7 +117,7 @@ workflow.onComplete { } /* -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ THE END -======================================================================================== +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ From caa66f827435bd3cb50da2717405fc4e030d2184 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Wed, 23 Mar 2022 13:53:16 +0000 Subject: [PATCH 093/169] Template update for nf-core/tools version 2.3.1 --- .editorconfig | 5 +- .github/CONTRIBUTING.md | 15 +- .github/ISSUE_TEMPLATE/bug_report.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 6 +- .github/workflows/awsfulltest.yml | 1 - .github/workflows/awstest.yml | 2 +- .github/workflows/branch.yml | 5 +- .github/workflows/ci.yml | 12 +- .github/workflows/linting.yml | 85 ++--------- .github/workflows/linting_comment.yml | 3 +- .gitpod.yml | 16 +- .markdownlint.yml | 14 -- .prettierrc.yml | 1 + .yamllint.yml | 6 - CHANGELOG.md | 2 + CITATIONS.md | 27 ++-- README.md | 31 ++-- assets/email_template.html | 142 ++++++++++++------ assets/multiqc_config.yaml | 11 -- assets/multiqc_config.yml | 11 ++ assets/schema_input.json | 5 +- docs/README.md | 8 +- docs/output.md | 28 ++-- docs/usage.md | 109 +++++++------- modules.json | 8 +- .../custom/dumpsoftwareversions/main.nf | 3 + .../custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/modules/fastqc/main.nf | 3 + modules/nf-core/modules/fastqc/meta.yml | 90 +++++------ modules/nf-core/modules/multiqc/main.nf | 9 +- modules/nf-core/modules/multiqc/meta.yml | 66 ++++---- nextflow_schema.json | 14 +- workflows/nanoseq.nf | 2 +- 33 files changed, 361 insertions(+), 382 deletions(-) delete mode 100644 .markdownlint.yml create mode 100644 .prettierrc.yml delete mode 100644 .yamllint.yml delete mode 100644 assets/multiqc_config.yaml create mode 100644 assets/multiqc_config.yml diff --git a/.editorconfig b/.editorconfig index 95549501..b6b31907 100644 --- a/.editorconfig +++ b/.editorconfig @@ -8,12 +8,9 @@ trim_trailing_whitespace = true indent_size = 4 indent_style = space -[*.{yml,yaml}] +[*.{md,yml,yaml,html,css,scss,js}] indent_size = 2 -[*.json] -insert_final_newline = unset - # These files are edited and tested upstream in nf-core/modules [/modules/nf-core/**] charset = unset diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cdbebfc6..a66e3acd 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -15,8 +15,7 @@ Contributions to the code are even more welcome ;) If you'd like to write some code for nf-core/nanoseq, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [nf-core/nanoseq issues](https://github.com/nf-core/nanoseq/issues) to avoid duplicating work - * If there isn't one already, please create one so that others know you're working on this +1. Check that there isn't already an issue about your idea in the [nf-core/nanoseq issues](https://github.com/nf-core/nanoseq/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/nanoseq repository](https://github.com/nf-core/nanoseq) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). @@ -49,9 +48,9 @@ These tests are run both with the latest available version of `Nextflow` and als :warning: Only in the unlikely and regretful event of a release happening with a bug. -* On your own fork, make a new branch `patch` based on `upstream/master`. -* Fix the bug, and bump version (X.Y.Z+1). -* A PR should be made on `master` from patch to directly this particular bug. +- On your own fork, make a new branch `patch` based on `upstream/master`. +- Fix the bug, and bump version (X.Y.Z+1). +- A PR should be made on `master` from patch to directly this particular bug. ## Getting help @@ -73,7 +72,7 @@ If you wish to contribute a new step, please use the following coding standards: 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. 8. If applicable, add a new test command in `.github/workflow/ci.yml`. -9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -92,8 +91,8 @@ The process resources can be passed on to the tool dynamically within the proces Please use the following naming schemes, to make it easy to understand what is going where. -* initial process channel: `ch_output_from_` -* intermediate and terminal channels: `ch__for_` +- initial process channel: `ch_output_from_` +- intermediate and terminal channels: `ch__for_` ### Nextflow version bumping diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 17dc3e7f..dfcd7148 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -2,7 +2,6 @@ name: Bug report description: Report something that is broken or incorrect labels: bug body: - - type: markdown attributes: value: | diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index f8737b7b..96e18647 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,10 +16,10 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/nano - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/nanoseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/nanoseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker` --outdir `). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 4528529d..8017004b 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -18,7 +18,6 @@ jobs: # TODO nf-core: You can customise AWS full pipeline tests as required # Add full size test data (but still relatively small datasets for few samples) # on the `test_full.config` test runs with only one set of parameters - with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 3be3085b..766aad02 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -10,9 +10,9 @@ jobs: if: github.repository == 'nf-core/nanoseq' runs-on: ubuntu-latest steps: + # Launch workflow using Tower CLI tool action - name: Launch workflow via tower uses: nf-core/tower-action@v3 - with: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 859f1daf..5eee8118 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,8 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/nanoseq' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/nanoseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] - + "{ [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/nanoseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]]" # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets @@ -43,4 +42,4 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - +# diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 742dc51d..bde19cf7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -16,18 +16,18 @@ jobs: test: name: Run pipeline with test data # Only run on push if this is the nf-core dev branch (merged PRs) - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }}" runs-on: ubuntu-latest strategy: matrix: # Nextflow versions include: # Test pipeline minimum Nextflow version - - NXF_VER: '21.10.3' - NXF_EDGE: '' + - NXF_VER: "21.10.3" + NXF_EDGE: "" # Test latest edge release of Nextflow - - NXF_VER: '' - NXF_EDGE: '1' + - NXF_VER: "" + NXF_EDGE: "1" steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -48,3 +48,5 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + +# diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fda934c0..e9cf5de3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,6 +1,7 @@ name: nf-core linting # This workflow is triggered on pushes and PRs to the repository. -# It runs the `nf-core lint` and markdown lint tests to ensure that the code meets the nf-core guidelines +# It runs the `nf-core lint` and markdown lint tests to ensure +# that the code meets the nf-core guidelines. on: push: pull_request: @@ -8,42 +9,6 @@ on: types: [published] jobs: - Markdown: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 - - name: Install markdownlint - run: npm install -g markdownlint-cli - - name: Run Markdownlint - run: markdownlint . - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## Markdown linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `markdownlint-cli` - * On Mac: `brew install markdownlint-cli` - * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) - * Fix the markdown errors - * Automatically: `markdownlint . --fix` - * Manually resolve anything left from `markdownlint .` - - Once you push these changes the test should pass, and you can hide this comment :+1: - - We highly recommend setting up markdownlint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! - - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false - EditorConfig: runs-on: ubuntu-latest steps: @@ -55,49 +20,24 @@ jobs: run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') - YAML: + Prettier: runs-on: ubuntu-latest steps: - - name: Checkout - uses: actions/checkout@master - - name: 'Yamllint' - uses: karancode/yamllint-github-action@master - with: - yamllint_file_or_dir: '.' - yamllint_config_filepath: '.yamllint.yml' - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## YAML linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `yamllint` - * Install `yamllint` following [this](https://yamllint.readthedocs.io/en/stable/quickstart.html#installing-yamllint) - instructions or alternative install it in your [conda environment](https://anaconda.org/conda-forge/yamllint) - * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml") -c ./.yamllint.yml` - * Fix any reported errors in your YAML files + - uses: actions/checkout@v2 - Once you push these changes the test should pass, and you can hide this comment :+1: + - uses: actions/setup-node@v2 - We highly recommend setting up yaml-lint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + - name: Install Prettier + run: npm install -g prettier - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false + - name: Run Prettier --check + run: prettier --check ${GITHUB_WORKSPACE} nf-core: runs-on: ubuntu-latest steps: - - name: Check out pipeline code uses: actions/checkout@v2 @@ -110,8 +50,8 @@ jobs: - uses: actions/setup-python@v1 with: - python-version: '3.6' - architecture: 'x64' + python-version: "3.6" + architecture: "x64" - name: Install dependencies run: | @@ -139,3 +79,4 @@ jobs: lint_results.md PR_number.txt +# diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 44d72994..91c487a1 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -1,4 +1,3 @@ - name: nf-core linting comment # This workflow is triggered after the linting action is complete # It posts an automated comment to the PR, even if the PR is coming from a fork @@ -27,4 +26,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md - +# diff --git a/.gitpod.yml b/.gitpod.yml index b7d4cee1..c452ee93 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -2,13 +2,13 @@ image: nfcore/gitpod:latest vscode: extensions: # based on nf-core.nf-core-extensionpack - - codezombiech.gitignore # Language support for .gitignore files + - codezombiech.gitignore # Language support for .gitignore files # - cssho.vscode-svgviewer # SVG viewer - - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code - - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed - - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar - - mechatroner.rainbow-csv # Highlight columns in csv files in different colors + - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed + - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files + - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar + - mechatroner.rainbow-csv # Highlight columns in csv files in different colors # - nextflow.nextflow # Nextflow syntax highlighting - - oderwat.indent-rainbow # Highlight indentation level - - streetsidesoftware.code-spell-checker # Spelling checker for source code + - oderwat.indent-rainbow # Highlight indentation level + - streetsidesoftware.code-spell-checker # Spelling checker for source code diff --git a/.markdownlint.yml b/.markdownlint.yml deleted file mode 100644 index 9e605fcf..00000000 --- a/.markdownlint.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Markdownlint configuration file -default: true -line-length: false -ul-indent: - indent: 4 -no-duplicate-header: - siblings_only: true -no-inline-html: - allowed_elements: - - img - - p - - kbd - - details - - summary diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 00000000..c81f9a76 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1 @@ +printWidth: 120 diff --git a/.yamllint.yml b/.yamllint.yml deleted file mode 100644 index d466deec..00000000 --- a/.yamllint.yml +++ /dev/null @@ -1,6 +0,0 @@ -extends: default - -rules: - document-start: disable - line-length: disable - truthy: disable diff --git a/CHANGELOG.md b/CHANGELOG.md index bbaaa186..04e4ba2f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ Initial release of nf-core/nanoseq, created with the [nf-core](https://nf-co.re/ ### `Fixed` +- Clarified conda usage and added an installation tutorial for Singularity since the one on Syllabs' website uses an outdate version of GO Compiler + ### `Dependencies` ### `Deprecated` diff --git a/CITATIONS.md b/CITATIONS.md index 5cf99706..bf7d6621 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,23 +10,26 @@ ## Pipeline tools -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. +- [MultiQC](https://pubmed.ncbi.nlm.nih.gov/27312411/) + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. ## Software packaging/containerisation tools -* [Anaconda](https://anaconda.com) - > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. +- [Anaconda](https://anaconda.com) -* [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) - > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. + > Anaconda Software Distribution. Computer software. Vers. 2-2.4.0. Anaconda, Nov. 2016. Web. -* [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) - > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. +- [Bioconda](https://pubmed.ncbi.nlm.nih.gov/29967506/) -* [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + > Grüning B, Dale R, Sjödin A, Chapman BA, Rowe J, Tomkins-Tinch CH, Valieris R, Köster J; Bioconda Team. Bioconda: sustainable and comprehensive software distribution for the life sciences. Nat Methods. 2018 Jul;15(7):475-476. doi: 10.1038/s41592-018-0046-7. PubMed PMID: 29967506. -* [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) - > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. +- [BioContainers](https://pubmed.ncbi.nlm.nih.gov/28379341/) + + > da Veiga Leprevost F, Grüning B, Aflitos SA, Röst HL, Uszkoreit J, Barsnes H, Vaudel M, Moreno P, Gatto L, Weber J, Bai M, Jimenez RC, Sachsenberg T, Pfeuffer J, Alvarez RV, Griss J, Nesvizhskii AI, Perez-Riverol Y. BioContainers: an open-source and community-driven framework for software standardization. Bioinformatics. 2017 Aug 15;33(16):2580-2582. doi: 10.1093/bioinformatics/btx192. PubMed PMID: 28379341; PubMed Central PMCID: PMC5870671. + +- [Docker](https://dl.acm.org/doi/10.5555/2600239.2600241) + +- [Singularity](https://pubmed.ncbi.nlm.nih.gov/28494014/) + > Kurtzer GM, Sochat V, Bauer MW. Singularity: Scientific containers for mobility of compute. PLoS One. 2017 May 11;12(5):e0177459. doi: 10.1371/journal.pone.0177459. eCollection 2017. PubMed PMID: 28494014; PubMed Central PMCID: PMC5426675. diff --git a/README.md b/README.md index cb51a32d..846900e6 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_dark.png#gh-dark-mode-only) +# ![nf-core/nanoseq](docs/images/nf-core/nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core/nanoseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+linting%22) @@ -17,11 +17,13 @@ ## Introduction + **nf-core/nanoseq** is a bioinformatics best-practice analysis pipeline for A pipeline to demultiplex, QC and map Nanopore data. The pipeline is built using [Nextflow](https://www.nextflow.io), a workflow tool to run tasks across multiple compute infrastructures in a very portable manner. It uses Docker/Singularity containers making installation trivial and results highly reproducible. The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementation of this pipeline uses one container per process which makes it much easier to maintain and update software dependencies. Where possible, these processes have been submitted to and installed from [nf-core/modules](https://github.com/nf-core/modules) in order to make them available to all nf-core pipelines, and to everyone within the Nextflow community! + On release, automated continuous integration tests run the pipeline on a full-sized dataset on the AWS cloud infrastructure. This ensures that the pipeline runs on AWS, has sensible resource allocation defaults set to run on real-world datasets, and permits the persistent storage of results to benchmark between pipeline releases and other analysis sources. The results obtained from the full-sized test can be viewed on the [nf-core website](https://nf-co.re/nanoseq/results). ## Pipeline summary @@ -35,28 +37,28 @@ On release, automated continuous integration tests run the pipeline on a full-si 1. Install [`Nextflow`](https://www.nextflow.io/docs/latest/getstarted.html#installation) (`>=21.10.3`) -2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(please only use [`Conda`](https://conda.io/miniconda.html) as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_ +2. Install any of [`Docker`](https://docs.docker.com/engine/installation/), [`Singularity`](https://www.sylabs.io/guides/3.0/user-guide/) (you can follow [this tutorial](https://singularity-tutorial.github.io/01-installation/)), [`Podman`](https://podman.io/), [`Shifter`](https://nersc.gitlab.io/development/shifter/how-to-use/) or [`Charliecloud`](https://hpc.github.io/charliecloud/) for full pipeline reproducibility _(you can use [`Conda`](https://conda.io/miniconda.html) both to install Nextflow itself and also to manage software within pipelines. Please only use it within pipelines as a last resort; see [docs](https://nf-co.re/usage/configuration#basic-configuration-profiles))_. 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console - nextflow run nf-core/nanoseq -profile test,YOURPROFILE --outdir - ``` + ```console + nextflow run nf-core/nanoseq -profile test,YOURPROFILE --outdir + ``` - Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. - > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. - > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. - > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. + > - The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. + > - Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > - If you are using `singularity`, please use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > - If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! - + - ```console - nextflow run nf-core/nanoseq --input samplesheet.csv --outdir --genome GRCh37 -profile - ``` + ```console + nextflow run nf-core/nanoseq --input samplesheet.csv --outdir --genome GRCh37 -profile + ``` ## Documentation @@ -82,6 +84,7 @@ For further information or help, don't hesitate to get in touch on the [Slack `# + An extensive list of references for the tools used by the pipeline can be found in the [`CITATIONS.md`](CITATIONS.md) file. You can cite the `nf-core` publication as follows: diff --git a/assets/email_template.html b/assets/email_template.html index 93137811..36ece146 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,53 +1,111 @@ - - - - + + + + - - nf-core/nanoseq Pipeline Report - - -

+ + + nf-core/nanoseq Pipeline Report + + +
+ - +

nf-core/nanoseq v${version}

+

Run Name: $runName

-

nf-core/nanoseq v${version}

-

Run Name: $runName

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

nf-core/nanoseq execution completed unsuccessfully!

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

nf-core/nanoseq execution completed unsuccessfully!

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

The full error message was:

-
${errorReport}
-
- """ -} else { - out << """ -
+
${errorReport}
+
+ """ } else { out << """ +
nf-core/nanoseq execution completed successfully! -
- """ -} -%> +
+ """ } %> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
+$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> "" }.join("\n") %> - -
$k
$v
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> " + + + + + " }.join("\n") %> + +
+ $k + +
$v
+
-

nf-core/nanoseq

-

https://github.com/nf-core/nanoseq

- -
- - +

nf-core/nanoseq

+

https://github.com/nf-core/nanoseq

+
+ diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml deleted file mode 100644 index 365f1651..00000000 --- a/assets/multiqc_config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/nanoseq - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - software_versions: - order: -1000 - nf-core-nanoseq-summary: - order: -1001 - -export_plots: true diff --git a/assets/multiqc_config.yml b/assets/multiqc_config.yml new file mode 100644 index 00000000..49c53cbb --- /dev/null +++ b/assets/multiqc_config.yml @@ -0,0 +1,11 @@ +report_comment: > + This report has been generated by the nf-core/nanoseq + analysis pipeline. For information about how to interpret these results, please see the + documentation. +report_section_order: + software_versions: + order: -1000 + "nf-core-nanoseq-summary": + order: -1001 + +export_plots: true diff --git a/assets/schema_input.json b/assets/schema_input.json index d47ba207..5542a018 100644 --- a/assets/schema_input.json +++ b/assets/schema_input.json @@ -31,9 +31,6 @@ ] } }, - "required": [ - "sample", - "fastq_1" - ] + "required": ["sample", "fastq_1"] } } diff --git a/docs/README.md b/docs/README.md index cd206cc8..b8efb5f8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,9 +2,9 @@ The nf-core/nanoseq documentation is split into the following pages: -* [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. -* [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. +- [Usage](usage.md) + - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +- [Output](output.md) + - An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/docs/output.md b/docs/output.md index 35335b2d..680d8e19 100644 --- a/docs/output.md +++ b/docs/output.md @@ -12,18 +12,18 @@ The directories listed below will be created in the results directory after the The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes data using the following steps: -* [FastQC](#fastqc) - Raw read QC -* [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline -* [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution +- [FastQC](#fastqc) - Raw read QC +- [MultiQC](#multiqc) - Aggregate report describing results and QC from the whole pipeline +- [Pipeline information](#pipeline-information) - Report metrics generated during the workflow execution ### FastQC
Output files -* `fastqc/` - * `*_fastqc.html`: FastQC report containing quality metrics. - * `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images. +- `fastqc/` + - `*_fastqc.html`: FastQC report containing quality metrics. + - `*_fastqc.zip`: Zip archive containing the FastQC report, tab-delimited data file and plot images.
@@ -42,10 +42,10 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/) and processes d
Output files -* `multiqc/` - * `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - * `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - * `multiqc_plots/`: directory containing static images from the report in various formats. +- `multiqc/` + - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. + - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: directory containing static images from the report in various formats.
@@ -58,10 +58,10 @@ Results generated by MultiQC collate pipeline QC from supported tools e.g. FastQ
Output files -* `pipeline_info/` - * Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - * Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - * Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. +- `pipeline_info/` + - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. + - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. + - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`.
diff --git a/docs/usage.md b/docs/usage.md index 3fc5fee8..f9b7aaeb 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -44,11 +44,11 @@ TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, ``` -| Column | Description | -|----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | -| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | -| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| Column | Description | +| --------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `sample` | Custom sample name. This entry will be identical for multiple sequencing libraries/runs from the same sample. Spaces in sample names are automatically converted to underscores (`_`). | +| `fastq_1` | Full path to FastQ file for Illumina short reads 1. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | +| `fastq_2` | Full path to FastQ file for Illumina short reads 2. File has to be gzipped and have the extension ".fastq.gz" or ".fq.gz". | An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. @@ -57,7 +57,7 @@ An [example samplesheet](../assets/samplesheet.csv) has been provided with the p The typical command for running the pipeline is as follows: ```console -nextflow run nf-core/nanoseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker +nextflow run nf-core/nanoseq --input samplesheet.csv --outdir --genome GRCh37 -profile docker ``` This will launch the pipeline with the `docker` configuration profile. See below for more information about profiles. @@ -65,9 +65,9 @@ This will launch the pipeline with the `docker` configuration profile. See below Note that the pipeline will create the following files in your working directory: ```console -work # Directory containing the nextflow working files -results # Finished results (configurable, see below) -.nextflow_log # Log file from Nextflow +work # Directory containing the nextflow working files + # Finished results in specified location (defined with --outdir) +.nextflow_log # Log file from Nextflow # Other nextflow hidden files, eg. history of pipeline runs and old logs. ``` @@ -106,25 +106,25 @@ They are loaded in sequence, so later profiles can overwrite earlier profiles. If `-profile` is not specified, the pipeline will run locally and expect all software to be installed and available on the `PATH`. This is _not_ recommended. -* `docker` - * A generic configuration profile to be used with [Docker](https://docker.com/) -* `singularity` - * A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) -* `podman` - * A generic configuration profile to be used with [Podman](https://podman.io/) -* `shifter` - * A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) -* `charliecloud` - * A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) -* `conda` - * A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. -* `test` - * A profile with a complete configuration for automated testing - * Includes links to test data so needs no other parameters +- `docker` + - A generic configuration profile to be used with [Docker](https://docker.com/) +- `singularity` + - A generic configuration profile to be used with [Singularity](https://sylabs.io/docs/) +- `podman` + - A generic configuration profile to be used with [Podman](https://podman.io/) +- `shifter` + - A generic configuration profile to be used with [Shifter](https://nersc.gitlab.io/development/shifter/how-to-use/) +- `charliecloud` + - A generic configuration profile to be used with [Charliecloud](https://hpc.github.io/charliecloud/) +- `conda` + - A generic configuration profile to be used with [Conda](https://conda.io/docs/). Please only use Conda as a last resort i.e. when it's not possible to run the pipeline with Docker, Singularity, Podman, Shifter or Charliecloud. +- `test` + - A profile with a complete configuration for automated testing + - Includes links to test data so needs no other parameters ### `-resume` -Specify this when restarting a pipeline. Nextflow will used cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. +Specify this when restarting a pipeline. Nextflow will use cached results from any pipeline steps where the inputs are the same, continuing from where it got to previously. For input to be considered the same, not only the names must be identical but the files' contents as well. For more info about this parameter, see [this blog post](https://www.nextflow.io/blog/2019/demystifying-nextflow-resume.html). You can also supply a run name to resume a specific run: `-resume [run-name]`. Use the `nextflow log` command to show previous run names. @@ -186,6 +186,7 @@ process { ``` > **NB:** We specify the full process name i.e. `NFCORE_RNASEQ:RNASEQ:ALIGN_STAR:STAR_ALIGN` in the config file because this takes priority over the short name (`STAR_ALIGN`) and allows existing configuration using the full process name to be correctly overridden. +> > If you get a warning suggesting that the process selector isn't recognised check that the process name has been specified correctly. ### Updating containers @@ -196,35 +197,35 @@ The [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) implementatio 2. Find the latest version of the Biocontainer available on [Quay.io](https://quay.io/repository/biocontainers/pangolin?tag=latest&tab=tags) 3. Create the custom config accordingly: - * For Docker: - - ```nextflow - process { - withName: PANGOLIN { - container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` - - * For Singularity: - - ```nextflow - process { - withName: PANGOLIN { - container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' - } - } - ``` - - * For Conda: - - ```nextflow - process { - withName: PANGOLIN { - conda = 'bioconda::pangolin=3.0.5' - } - } - ``` + - For Docker: + + ```nextflow + process { + withName: PANGOLIN { + container = 'quay.io/biocontainers/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + - For Singularity: + + ```nextflow + process { + withName: PANGOLIN { + container = 'https://depot.galaxyproject.org/singularity/pangolin:3.0.5--pyhdfd78af_0' + } + } + ``` + + - For Conda: + + ```nextflow + process { + withName: PANGOLIN { + conda = 'bioconda::pangolin=3.0.5' + } + } + ``` > **NB:** If you wish to periodically update individual tool-specific results (e.g. Pangolin) generated by the pipeline then you must ensure to keep the `work/` directory otherwise the `-resume` ability of the pipeline will be compromised and it will restart from scratch. diff --git a/modules.json b/modules.json index 8d08e6bb..f50f9428 100644 --- a/modules.json +++ b/modules.json @@ -4,14 +4,14 @@ "repos": { "nf-core/modules": { "custom/dumpsoftwareversions": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "fastqc": { - "git_sha": "9d0cad583b9a71a6509b754fdf589cbfbed08961" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "multiqc": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" } } } -} \ No newline at end of file +} diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 934bb467..327d5100 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -15,6 +15,9 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "software_versions_mqc.yml", emit: mqc_yml path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 5b5b8a60..60b546a0 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ['MIT'] + licence: ["MIT"] input: - versions: type: file diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index d250eca0..ed6b8c50 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -15,6 +15,9 @@ process FASTQC { tuple val(meta), path("*.zip") , emit: zip path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index b09553a3..4da5bb5a 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -1,52 +1,52 @@ name: fastqc description: Run FastQC on sequenced reads keywords: - - quality control - - qc - - adapters - - fastq + - quality control + - qc + - adapters + - fastq tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ['GPL-2.0-only'] + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ["GPL-2.0-only"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - html: + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf index 3dceb162..1264aac1 100644 --- a/modules/nf-core/modules/multiqc/main.nf +++ b/modules/nf-core/modules/multiqc/main.nf @@ -1,10 +1,10 @@ process MULTIQC { label 'process_medium' - conda (params.enable_conda ? 'bioconda::multiqc=1.11' : null) + conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.11--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.11--pyhdfd78af_0' }" + 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : + 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" input: path multiqc_files @@ -15,6 +15,9 @@ process MULTIQC { path "*_plots" , optional:true, emit: plots path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml index 63c75a45..6fa891ef 100644 --- a/modules/nf-core/modules/multiqc/meta.yml +++ b/modules/nf-core/modules/multiqc/meta.yml @@ -1,40 +1,40 @@ name: MultiQC description: Aggregate results from bioinformatics analyses across many samples into a single report keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report + - QC + - bioinformatics tools + - Beautiful stand-alone HTML report tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ['GPL-3.0-or-later'] + - multiqc: + description: | + MultiQC searches a given directory for analysis logs and compiles a HTML report. + It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. + homepage: https://multiqc.info/ + documentation: https://multiqc.info/docs/ + licence: ["GPL-3.0-or-later"] input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC + - multiqc_files: + type: file + description: | + List of reports / files recognised by MultiQC, for example the html and zip output of FastQC output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - report: + type: file + description: MultiQC report file + pattern: "multiqc_report.html" + - data: + type: dir + description: MultiQC data dir + pattern: "multiqc_data" + - plots: + type: file + description: Plots created by MultiQC + pattern: "*_data" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" + - "@abhi18av" + - "@bunop" + - "@drpatelh" diff --git a/nextflow_schema.json b/nextflow_schema.json index c0030cf7..a073376c 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,10 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "input", - "outdir" - ], + "required": ["input", "outdir"], "properties": { "input": { "type": "string", @@ -185,14 +182,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_on_fail": { diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index a9d9fd67..c93e9bf5 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -23,7 +23,7 @@ if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input sample ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ -ch_multiqc_config = file("$projectDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_config = file("$projectDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() /* From a02f60ec35c7b994f0a617fe8b82d031a70ffbb2 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Thu, 24 Mar 2022 11:42:12 +0000 Subject: [PATCH 094/169] Template update for nf-core/tools version 2.3.2 --- .github/PULL_REQUEST_TEMPLATE.md | 1 - .github/workflows/awsfulltest.yml | 2 -- .github/workflows/awstest.yml | 2 -- .gitpod.yml | 2 +- CHANGELOG.md | 2 -- 5 files changed, 1 insertion(+), 8 deletions(-) diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 96e18647..e7000854 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,7 +10,6 @@ Remember that PRs should be made against the dev branch, unless you're preparing Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) --> - ## PR checklist diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 8017004b..77cdfeac 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -22,8 +22,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/nanoseq/work-${{ github.sha }} parameters: | { diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 766aad02..9e958dd0 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -17,8 +17,6 @@ jobs: workspace_id: ${{ secrets.TOWER_WORKSPACE_ID }} access_token: ${{ secrets.TOWER_ACCESS_TOKEN }} compute_env: ${{ secrets.TOWER_COMPUTE_ENV }} - pipeline: ${{ github.repository }} - revision: ${{ github.sha }} workdir: s3://${{ secrets.AWS_S3_BUCKET }}/work/nanoseq/work-${{ github.sha }} parameters: | { diff --git a/.gitpod.yml b/.gitpod.yml index c452ee93..85d95ecc 100644 --- a/.gitpod.yml +++ b/.gitpod.yml @@ -4,7 +4,7 @@ vscode: extensions: # based on nf-core.nf-core-extensionpack - codezombiech.gitignore # Language support for .gitignore files # - cssho.vscode-svgviewer # SVG viewer - - davidanson.vscode-markdownlint # Markdown/CommonMark linting and style checking for Visual Studio Code + - esbenp.prettier-vscode # Markdown/CommonMark linting and style checking for Visual Studio Code - eamodio.gitlens # Quickly glimpse into whom, why, and when a line or code block was changed - EditorConfig.EditorConfig # override user/workspace settings with settings found in .editorconfig files - Gruntfuggly.todo-tree # Display TODO and FIXME in a tree view in the activity bar diff --git a/CHANGELOG.md b/CHANGELOG.md index 04e4ba2f..bbaaa186 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,8 +11,6 @@ Initial release of nf-core/nanoseq, created with the [nf-core](https://nf-co.re/ ### `Fixed` -- Clarified conda usage and added an installation tutorial for Singularity since the one on Syllabs' website uses an outdate version of GO Compiler - ### `Dependencies` ### `Deprecated` From a243d4e554161a52e38aba65aa11c343d395061e Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Thu, 24 Mar 2022 16:25:34 +0100 Subject: [PATCH 095/169] New subworkflow structure for variant calling --- conf/modules.config | 99 +++++++++++++++- conf/test_nobc_nodx_vc.config | 5 +- modules.json | 11 +- modules/local/cutesv.nf | 4 +- modules/local/deepvariant.nf | 47 ++++++++ modules/local/get_chrom_names.nf | 24 ++++ modules/local/medaka_variant.nf | 23 ++-- modules/local/sniffles.nf | 4 +- .../nf-core/modules/samtools/faidx/main.nf | 32 +++++ .../nf-core/modules/samtools/faidx/meta.yml | 43 +++++++ modules/nf-core/modules/tabix/bgzip/main.nf | 31 +++++ modules/nf-core/modules/tabix/bgzip/meta.yml | 41 +++++++ .../nf-core/modules/tabix/bgziptabix/main.nf | 33 ++++++ .../nf-core/modules/tabix/bgziptabix/meta.yml | 45 ++++++++ modules/nf-core/modules/tabix/tabix/main.nf | 30 +++++ modules/nf-core/modules/tabix/tabix/meta.yml | 41 +++++++ nextflow.config | 2 + subworkflows/local/prepare_genome.nf | 15 +++ subworkflows/local/short_variant_calling.nf | 109 ++++++++++++++++++ .../local/structural_variant_calling.nf | 82 ++++++++++--- subworkflows/local/variant_calling.nf | 49 -------- workflows/nanoseq.nf | 41 ++++--- 22 files changed, 711 insertions(+), 100 deletions(-) create mode 100644 modules/local/deepvariant.nf create mode 100644 modules/local/get_chrom_names.nf create mode 100644 modules/nf-core/modules/samtools/faidx/main.nf create mode 100644 modules/nf-core/modules/samtools/faidx/meta.yml create mode 100644 modules/nf-core/modules/tabix/bgzip/main.nf create mode 100644 modules/nf-core/modules/tabix/bgzip/meta.yml create mode 100644 modules/nf-core/modules/tabix/bgziptabix/main.nf create mode 100644 modules/nf-core/modules/tabix/bgziptabix/meta.yml create mode 100644 modules/nf-core/modules/tabix/tabix/main.nf create mode 100644 modules/nf-core/modules/tabix/tabix/meta.yml create mode 100644 subworkflows/local/short_variant_calling.nf delete mode 100644 subworkflows/local/variant_calling.nf diff --git a/conf/modules.config b/conf/modules.config index dd7f66af..6e9ca8a6 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -409,7 +409,50 @@ if (params.call_variants) { process { withName: MEDAKA_VARIANT { publishDir = [ - path: { "${params.outdir}/dna_variant_calling/medaka_variant" }, + path: { "${params.outdir}/variant_calling/medaka_variant" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: MEDAKA_TABIX_VCF { + publishDir = [ + path: { "${params.outdir}/variant_calling/medaka_variant" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + if (params.variant_caller == 'deepvariant') { + process { + withName: DEEPVARIANT { + ext.args = { "--model_type WGS" } + publishDir = [ + path: { "${params.outdir}/variant_calling/deepvariant" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: DEEPVARIANT_TABIX_VCF { + publishDir = [ + path: { "${params.outdir}/variant_calling/deepvariant" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: DEEPVARIANT_TABIX_GVCF { + publishDir = [ + path: { "${params.outdir}/variant_calling/deepvariant" }, mode: 'copy', enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } @@ -421,7 +464,59 @@ if (params.call_variants) { process { withName: SNIFFLES { publishDir = [ - path: { "${params.outdir}/dna_variant_calling/sniffles" }, + path: { "${params.outdir}/variant_calling/sniffles" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: SNIFFLES_BGZIP_VCF { + publishDir = [ + path: { "${params.outdir}/variant_calling/sniffles" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: SNIFFLES_TABIX_VCF { + publishDir = [ + path: { "${params.outdir}/variant_calling/sniffles" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } + if (params.structural_variant_caller == 'cutesv') { + process { + withName: CUTESV { + publishDir = [ + path: { "${params.outdir}/variant_calling/cutesv" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: CUTESV_BGZIP_VCF { + publishDir = [ + path: { "${params.outdir}/variant_calling/cutesv" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: CUTESV_TABIX_VCF { + publishDir = [ + path: { "${params.outdir}/variant_calling/cutesv" }, mode: 'copy', enabled: true, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 10c15217..88d2c324 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -13,7 +13,7 @@ params { // Limit resources so that this can run on Travis max_cpus = 2 - max_memory = 6.GB + max_memory = 8.GB max_time = 12.h // Input data to skip basecalling and demultiplexing, and variant call @@ -23,4 +23,7 @@ params { skip_quantification = true skip_demultiplexing = true call_variants = true + + variant_caller = 'medaka' + structural_variant_caller = 'sniffles' } diff --git a/modules.json b/modules.json index a623d7f1..bba597b4 100644 --- a/modules.json +++ b/modules.json @@ -15,6 +15,9 @@ "pycoqc": { "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" }, + "samtools/faidx": { + "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" + }, "samtools/flagstat": { "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, @@ -33,9 +36,15 @@ "stringtie/merge": { "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" }, + "tabix/bgzip": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, + "tabix/tabix": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, "untar": { "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" } } } -} +} \ No newline at end of file diff --git a/modules/local/cutesv.nf b/modules/local/cutesv.nf index de169910..992ee1fc 100644 --- a/modules/local/cutesv.nf +++ b/modules/local/cutesv.nf @@ -12,8 +12,8 @@ process CUTESV { path(fasta) output: - path "*_cuteSV.vcf" , emit: sv_calls // vcf files - path "versions.yml" , emit: versions + tuple val(meta), path("*_cuteSV.vcf") , emit: sv_calls // vcf files + path "versions.yml" , emit: versions script: """ diff --git a/modules/local/deepvariant.nf b/modules/local/deepvariant.nf new file mode 100644 index 00000000..9e4fad74 --- /dev/null +++ b/modules/local/deepvariant.nf @@ -0,0 +1,47 @@ +process DEEPVARIANT { + tag "$meta.id" + label 'process_medium' + + + if (params.enable_conda) { + exit 1, "Conda environments cannot be used when using the DeepVariant tool. Please use docker or singularity containers." + } + + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker.io/google/deepvariant:1.3.0' : + 'docker.io/google/deepvariant:1.3.0' }" + + input: + tuple val(meta), path(input), path(index), val(intervals) + path(fasta) + path(fai) + + output: + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.g.vcf.gz"), emit: gvcf + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def regions = intervals ? "--regions ${intervals}" : "" + + """ + /opt/deepvariant/bin/run_deepvariant \\ + --ref=${fasta} \\ + --reads=${input} \\ + --output_vcf=${prefix}.vcf.gz \\ + --output_gvcf=${prefix}.g.vcf.gz \\ + ${args} \\ + ${regions} \\ + --num_shards=${task.cpus} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' ) + END_VERSIONS + """ +} diff --git a/modules/local/get_chrom_names.nf b/modules/local/get_chrom_names.nf new file mode 100644 index 00000000..79c40e8e --- /dev/null +++ b/modules/local/get_chrom_names.nf @@ -0,0 +1,24 @@ +process GET_CHROM_NAMES { + + conda (params.enable_conda ? "bioconda::samtools=1.10" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0' : + 'quay.io/biocontainers/samtools:1.13--h8c37831_0' }" + + input: + tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) + + output: + path('chrom.names') , emit: chrom_names + path "versions.yml" , emit: versions + + script: + """ + samtools idxstats $bam | cut -f 1 | head -n -1 > chrom.names + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} \ No newline at end of file diff --git a/modules/local/medaka_variant.nf b/modules/local/medaka_variant.nf index 5b7e75ed..153fc21c 100644 --- a/modules/local/medaka_variant.nf +++ b/modules/local/medaka_variant.nf @@ -8,26 +8,31 @@ process MEDAKA_VARIANT { 'quay.io/biocontainers/medaka:1.4.4--py38h130def0_0' }" input: - tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) // + tuple val(meta), path(input), path(index), val(intervals) path(fasta) output: - path ("${meta.id}/round_1.vcf") , emit: variant_calls // vcf files - path "versions.yml" , emit: versions + tuple val(meta), path ("$output_vcf") , emit: vcf // vcf files + path "versions.yml" , emit: versions script: - //def args = options.args ?: '' - def split_mnps = params.split_mnps ? "-l" : '' - def phase_vcf = params.phase_vcf ? "-p" : '' + //def args = options.args ?: '' + def split_mnps = params.split_mnps ? "-l" : '' + def phase_vcf = params.phase_vcf ? "-p" : '' + + output_dir = "${meta.id}" + output_vcf = output_dir+"/round_1.vcf" """ + medaka_variant \\ -d \\ -f $fasta \\ - -i $bam \\ - -o ${meta.id}/ \\ + -i $input \\ + -o $output_dir \\ -t $task.cpus \\ + -r $meta.chr \\ $split_mnps \\ - $phase_vcf \\ + $phase_vcf cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/local/sniffles.nf b/modules/local/sniffles.nf index d1c887f8..52677420 100644 --- a/modules/local/sniffles.nf +++ b/modules/local/sniffles.nf @@ -12,8 +12,8 @@ process SNIFFLES { output: - path "*_sniffles.vcf" , emit: sv_calls // vcf files - path "versions.yml" , emit: versions + tuple val(meta), path("*_sniffles.vcf") , emit: sv_calls // vcf files + path "versions.yml" , emit: versions script: diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf new file mode 100644 index 00000000..7732a4ec --- /dev/null +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -0,0 +1,32 @@ +process SAMTOOLS_FAIDX { + tag "$fasta" + label 'process_low' + + conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : + 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + + input: + tuple val(meta), path(fasta) + + output: + tuple val(meta), path ("*.fai"), emit: fai + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + samtools \\ + faidx \\ + $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml new file mode 100644 index 00000000..e9767764 --- /dev/null +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -0,0 +1,43 @@ +name: samtools_faidx +description: Index FASTA file +keywords: + - index + - fasta +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@ewels" + - "@phue" diff --git a/modules/nf-core/modules/tabix/bgzip/main.nf b/modules/nf-core/modules/tabix/bgzip/main.nf new file mode 100644 index 00000000..90940a5d --- /dev/null +++ b/modules/nf-core/modules/tabix/bgzip/main.nf @@ -0,0 +1,31 @@ +process TABIX_BGZIP { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : + 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.gz"), emit: gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + bgzip -c $args $input > ${prefix}.${input.getExtension()}.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tabix/bgzip/meta.yml b/modules/nf-core/modules/tabix/bgzip/meta.yml new file mode 100644 index 00000000..207427e4 --- /dev/null +++ b/modules/nf-core/modules/tabix/bgzip/meta.yml @@ -0,0 +1,41 @@ +name: tabix_bgzip +description: Compresses files +keywords: + - compress + - bgzip + - tabix +tools: + - bgzip: + description: | + Bgzip compresses files in a similar manner to, and compatible with, gzip. + homepage: https://www.htslib.org/doc/tabix.html + documentation: http://www.htslib.org/doc/bgzip.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - file: + type: file + description: text file +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - file: + type: file + description: Output compressed file + pattern: "*.{gz}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@maxulysse" diff --git a/modules/nf-core/modules/tabix/bgziptabix/main.nf b/modules/nf-core/modules/tabix/bgziptabix/main.nf new file mode 100644 index 00000000..12657599 --- /dev/null +++ b/modules/nf-core/modules/tabix/bgziptabix/main.nf @@ -0,0 +1,33 @@ +process TABIX_BGZIPTABIX { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : + 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.gz"), path("*.tbi"), emit: gz_tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def args2 = task.ext.args2 ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + bgzip --threads ${task.cpus} -c $args $input > ${prefix}.gz + tabix $args2 ${prefix}.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tabix/bgziptabix/meta.yml b/modules/nf-core/modules/tabix/bgziptabix/meta.yml new file mode 100644 index 00000000..49c03289 --- /dev/null +++ b/modules/nf-core/modules/tabix/bgziptabix/meta.yml @@ -0,0 +1,45 @@ +name: tabix_bgziptabix +description: bgzip a sorted tab-delimited genome file and then create tabix index +keywords: + - bgzip + - compress + - index + - tabix + - vcf +tools: + - tabix: + description: Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/doc/tabix.html + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tab: + type: file + description: TAB-delimited genome position file + pattern: "*.{bed,gff,sam,vcf}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - gz: + type: file + description: Output compressed file + pattern: "*.{gz}" + - tbi: + type: file + description: tabix index file + pattern: "*.{gz.tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@maxulysse" diff --git a/modules/nf-core/modules/tabix/tabix/main.nf b/modules/nf-core/modules/tabix/tabix/main.nf new file mode 100644 index 00000000..5f516261 --- /dev/null +++ b/modules/nf-core/modules/tabix/tabix/main.nf @@ -0,0 +1,30 @@ +process TABIX_TABIX { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? 'bioconda::tabix=1.11' : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/tabix:1.11--hdfd78af_0' : + 'quay.io/biocontainers/tabix:1.11--hdfd78af_0' }" + + input: + tuple val(meta), path(tab) + + output: + tuple val(meta), path("*.tbi"), emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + """ + tabix $args $tab + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + tabix: \$(echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/ .*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/tabix/tabix/meta.yml b/modules/nf-core/modules/tabix/tabix/meta.yml new file mode 100644 index 00000000..89478abe --- /dev/null +++ b/modules/nf-core/modules/tabix/tabix/meta.yml @@ -0,0 +1,41 @@ +name: tabix_tabix +description: create tabix index from a sorted bgzip tab-delimited genome file +keywords: + - index + - tabix + - vcf +tools: + - tabix: + description: Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/doc/tabix.html + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tab: + type: file + description: TAB-delimited genome position file compressed with bgzip + pattern: "*.{bed.gz,gff.gz,sam.gz,vcf.gz}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - tbi: + type: file + description: tabix index file + pattern: "*.{tbi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@joseespinosa" + - "@drpatelh" + - "@maxulysse" diff --git a/nextflow.config b/nextflow.config index 164afb92..1abbf099 100644 --- a/nextflow.config +++ b/nextflow.config @@ -45,10 +45,12 @@ params { call_variants = false variant_caller = 'medaka' structural_variant_caller = 'sniffles' + no_intervals = false split_mnps = false phase_vcf = false skip_vc = false skip_sv = false + keepgvcf = false // Options: Visualisation skip_bigbed = false diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index f415dea1..4138dfa7 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -4,6 +4,7 @@ include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { GTF2BED } from '../../modules/local/gtf2bed' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' workflow PREPARE_GENOME { take: @@ -47,8 +48,22 @@ workflow PREPARE_GENOME { .map { it -> [ it[5], it[0], it[6], it[1], it[7], it[8] ]} // [ fasta, sizes, gtf, bed, is_transcripts, annotation_str ] .unique() .set { ch_fasta_index } + + /* + * Convert GTF to BED12 + */ + ch_fastq + .filter { it[2] } + .map { it -> [ it[0], it[2] ] } // [ gtf, annotation_str ] + .unique() + .set { ch_fasta } + + SAMTOOLS_FAIDX ( ch_fasta ) + ch_fai = SAMTOOLS_FAIDX.out.fai emit: + ch_fasta + ch_fai ch_fasta_index ch_gtf_bed samtools_version diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf new file mode 100644 index 00000000..d972c95b --- /dev/null +++ b/subworkflows/local/short_variant_calling.nf @@ -0,0 +1,109 @@ +/* + * Short variant calling + */ + +include { GET_CHROM_NAMES } from '../../modules/local/get_chrom_names' +include { MEDAKA_VARIANT } from '../../modules/local/medaka_variant' +include { TABIX_BGZIP as MEDAKA_BGZIP_VCF } from '../../modules/nf-core/modules/tabix/bgzip/main' +include { TABIX_TABIX as MEDAKA_TABIX_VCF } from '../../modules/nf-core/modules/tabix/tabix/main' +include { DEEPVARIANT } from '../../modules/local/deepvariant' +include { TABIX_TABIX as DEEPVARIANT_TABIX_VCF } from '../../modules/nf-core/modules/tabix/tabix/main' +include { TABIX_TABIX as DEEPVARIANT_TABIX_GVCF } from '../../modules/nf-core/modules/tabix/tabix/main' +include { SNIFFLES } from '../../modules/local/sniffles' +include { CUTESV } from '../../modules/local/cutesv' + +workflow SHORT_VARIANT_CALLING { + + take: + ch_view_sortbam + ch_fasta + ch_fai + + main: + ch_short_calls_vcf = Channel.empty() + ch_short_calls_vcf_tbi = Channel.empty() + ch_short_calls_gvcf = Channel.empty() + ch_short_calls_gvcf_tbi = Channel.empty() + + medaka_version = Channel.empty() + deepvariant_version = Channel.empty() + bgzip_version = Channel.empty() + tabix_version = Channel.empty() + + /* + * Get names of chromosomes from bam file + */ + GET_CHROM_NAMES( ch_view_sortbam ) + ch_chrom_names = GET_CHROM_NAMES.out.chrom_names + + /* + * Map + */ + ch_chrom_names + .splitCsv() + .combine( ch_view_sortbam ) + .unique() + .map { chroms, meta, sizes, is_transcripts, bam, bai -> + new_meta = meta.clone() + new_meta.id = meta.id + "_" + chroms + new_meta.sample = meta.id + new_meta.chr = chroms + [new_meta, bam, bai, chroms] + }.set { ch_view_sortbam_split } + + //ch_view_sortbam + //.combine( ch_chrom_names ) + //.unique() + //.map{ meta, sizes, is_transcripts, bam, bai, chroms -> + //[meta, bam, bai, chroms ] + //}.set{ ch_view_sortbam_split } + + /* + * Call short variants + */ + if (params.variant_caller == 'medaka'){ + /* + * MEDAKA + */ + MEDAKA_VARIANT( ch_view_sortbam_split, ch_fasta ) + medaka_version = MEDAKA_VARIANT.out.versions + + MEDAKA_BGZIP_VCF( MEDAKA_VARIANT.out.vcf ) + ch_short_calls_vcf = MEDAKA_BGZIP_VCF.out.gz + bgzip_version = MEDAKA_BGZIP_VCF.out.versions + + MEDAKA_TABIX_VCF( ch_short_calls_vcf ) + ch_short_calls_vcf_tbi = MEDAKA_TABIX_VCF.out.tbi + tabix_version = MEDAKA_TABIX_VCF.out.versions + + } else { + /* + * DEEPVARIANT + */ + DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) + ch_short_calls_vcf = DEEPVARIANT.out.vcf + ch_short_calls_gvcf = DEEPVARIANT.out.gvcf + deepvariant_version = DEEPVARIANT.out.versions + + DEEPVARIANT_TABIX_VCF( ch_short_calls_vcf ) + ch_short_calls_vcf_tbi = DEEPVARIANT_TABIX_VCF.out.tbi + tabix_version = DEEPVARIANT_TABIX_VCF.out.versions + + DEEPVARIANT_TABIX_GVCF( ch_short_calls_gvcf ) + ch_short_calls_gvcf_tbi = DEEPVARIANT_TABIX_GVCF.out.tbi + tabix_version = DEEPVARIANT_TABIX_VCF.out.versions + + } + + + emit: + ch_short_calls_vcf + ch_short_calls_vcf_tbi + ch_short_calls_gvcf + ch_short_calls_gvcf_tbi + bgzip_version + tabix_version + medaka_version + deepvariant_version + +} diff --git a/subworkflows/local/structural_variant_calling.nf b/subworkflows/local/structural_variant_calling.nf index 094f5165..3f535217 100644 --- a/subworkflows/local/structural_variant_calling.nf +++ b/subworkflows/local/structural_variant_calling.nf @@ -2,41 +2,93 @@ * Structural variant calling */ -include { SNIFFLES } from '../../modules/local/sniffles' -include { CUTESV } from '../../modules/local/cutesv' +include { GET_CHROM_NAMES } from '../../modules/local/get_chrom_names' +include { SNIFFLES } from '../../modules/local/sniffles' +include { TABIX_BGZIP as SNIFFLES_BGZIP_VCF } from '../../modules/nf-core/modules/tabix/bgzip/main' +include { TABIX_TABIX as SNIFFLES_TABIX_VCF } from '../../modules/nf-core/modules/tabix/tabix/main' +include { CUTESV } from '../../modules/local/cutesv' +include { TABIX_BGZIP as CUTESV_BGZIP_VCF } from '../../modules/nf-core/modules/tabix/bgzip/main' +include { TABIX_TABIX as CUTESV_TABIX_VCF } from '../../modules/nf-core/modules/tabix/tabix/main' + workflow STRUCTURAL_VARIANT_CALLING { - main: take: ch_view_sortbam - ch_index + ch_fasta + ch_fai main: - ch_sv_calls = Channel.empty() - sniffles_version = Channel.empty() - cutesv_version = Channel.empty() - if (params.structural_variant_caller == 'sniffles'){ + ch_sv_calls_vcf = Channel.empty() + ch_sv_calls_vcf_tbi = Channel.empty() + + sniffles_version = Channel.empty() + cutesv_version = Channel.empty() + bgzip_version = Channel.empty() + tabix_version = Channel.empty() + + /* + * Get names of chromosomes from bam file + */ + GET_CHROM_NAMES( ch_view_sortbam ) + ch_chrom_names = GET_CHROM_NAMES.out.chrom_names + + /* + * Map + */ + ch_chrom_names + .splitCsv() + .combine( ch_view_sortbam ) + .unique() + .map { chroms, meta, sizes, is_transcripts, bam, bai -> + new_meta = meta.clone() + new_meta.id = meta.id + "_" + chroms + new_meta.sample = meta.id + new_meta.chr = chroms + [new_meta, bam, bai, chroms] + }.set { ch_view_sortbam_split } + + /* + * Call structural variants + */ + if (params.structural_variant_caller == 'sniffles') { /* - * Call structural variants with SNIFFLES + * SNIFFLES */ SNIFFLES( ch_view_sortbam ) - ch_sv_calls = SNIFFLES.out.sv_calls sniffles_version = SNIFFLES.out.versions + SNIFFLES_BGZIP_VCF( SNIFFLES.out.sv_calls ) + ch_sv_calls_vcf = SNIFFLES_BGZIP_VCF.out.gz + bgzip_version = SNIFFLES_BGZIP_VCF.out.versions + + SNIFFLES_TABIX_VCF( ch_sv_calls_vcf ) + ch_sv_calls_tbi = SNIFFLES_TABIX_VCF.out.tbi + tabix_version = SNIFFLES_TABIX_VCF.out.versions + } else { /* - * Call structural variants with cuteSV + * CUTESV */ - CUTESV( ch_view_sortbam, ch_index ) - ch_sv_calls = CUTESV.out.sv_calls + CUTESV( ch_view_sortbam, ch_fasta ) cutesv_version = CUTESV.out.versions + CUTESV_BGZIP_VCF( CUTESV.out.sv_calls ) + ch_sv_calls_vcf = CUTESV_BGZIP_VCF.out.gz + bgzip_version = CUTESV_BGZIP_VCF.out.versions + + CUTESV_TABIX_VCF( ch_sv_calls_vcf ) + ch_sv_calls_tbi = CUTESV_TABIX_VCF.out.tbi + tabix_version = CUTESV_TABIX_VCF.out.versions + } emit: - ch_sv_calls + ch_sv_calls_vcf + ch_sv_calls_vcf_tbi + bgzip_version + tabix_version sniffles_version cutesv_version -} +} \ No newline at end of file diff --git a/subworkflows/local/variant_calling.nf b/subworkflows/local/variant_calling.nf deleted file mode 100644 index 6d5958ce..00000000 --- a/subworkflows/local/variant_calling.nf +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Variant calling - */ - -include { MEDAKA_VARIANT } from '../../modules/local/medaka_variant' -include { SNIFFLES } from '../../modules/local/sniffles' -//include { CUTESV } from '../../modules/local/cutesv' - -workflow VARIANT_CALLING { - - main: - take: - ch_view_sortbam - ch_index - - main: - ch_variant_calls = Channel.empty() - medaka_version = Channel.empty() - if (params.variant_caller == 'medaka'){ - /* - * Split into a different channel for each chromosome - */ - // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling - //SPLIT_CHROM( ch_view_sortbam ) - //.splitCsv() - //.combine( ch_view_sortbam ) // - //.unique() - //.map { it -> [ it[1], it[4], it[5], it[0] ] } // - //.map{ meta, bam, bai, chrom -> - //new_meta = meta.clone() - //new_meta.chrom = chrom - //[new_meta, bam, bai] - //}.set{ch_bam_vc_chrom} - - /* - * Call short variants - */ - MEDAKA_VARIANT( ch_view_sortbam, ch_index ) - ch_variant_calls = MEDAKA_VARIANT.out.variant_calls - medaka_version = MEDAKA_VARIANT.out.versions - } - ch_sv_calls = Channel.empty() - sniffles_version = Channel.empty() - - emit: - ch_variant_calls - medaka_version - -} diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index ebe78cbe..21039235 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -78,8 +78,8 @@ if (params.call_variants) { if (params.protocol != 'DNA') { exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA'" } - if (!params.skip_vc && params.variant_caller != 'medaka') { - exit 1, "Invalid variant caller option: ${params.variant_caller}. Valid options: 'medaka'" + if (!params.skip_vc && params.variant_caller != 'medaka' && params.variant_caller != 'deepvariant') { + exit 1, "Invalid variant caller option: ${params.variant_caller}. Valid options: 'medaka' or 'deepvariant'" } if (!params.skip_sv && params.structural_variant_caller != 'sniffles' && params.structural_variant_caller != 'cutesv') { exit 1, "Invalid structural variant caller option: ${params.structural_variant_caller}. Valid options: 'sniffles', 'cutesv" @@ -130,7 +130,7 @@ include { QCFASTQ_NANOPLOT_FASTQC } from '../subworkflows/local/qcfastq include { ALIGN_GRAPHMAP2 } from '../subworkflows/local/align_graphmap2' include { ALIGN_MINIMAP2 } from '../subworkflows/local/align_minimap2' include { BAM_SORT_INDEX_SAMTOOLS } from '../subworkflows/local/bam_sort_index_samtools' -include { VARIANT_CALLING } from '../subworkflows/local/variant_calling' +include { SHORT_VARIANT_CALLING } from '../subworkflows/local/short_variant_calling' include { STRUCTURAL_VARIANT_CALLING } from '../subworkflows/local/structural_variant_calling' include { BEDTOOLS_UCSC_BIGWIG } from '../subworkflows/local/bedtools_ucsc_bigwig' include { BEDTOOLS_UCSC_BIGBED } from '../subworkflows/local/bedtools_ucsc_bigbed' @@ -312,6 +312,8 @@ workflow NANOSEQ{ PREPARE_GENOME ( ch_fastq ) ch_fasta_index = PREPARE_GENOME.out.ch_fasta_index ch_gtf_bed = PREPARE_GENOME.out.ch_gtf_bed + ch_fasta = PREPARE_GENOME.out.ch_fasta + ch_fai = PREPARE_GENOME.out.ch_fai ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.samtools_version.first().ifEmpty(null)) ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.gtf2bed_version.first().ifEmpty(null)) if (params.aligner == 'minimap2') { @@ -341,24 +343,25 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.versions.first().ifEmpty(null)) ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - if (params.call_variants && params.protocol == 'DNA') { - /* - * SUBWORKFLOW: Variant calling - */ - if(!params.skip_vc) { - VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] } ) - ch_software_versions = ch_software_versions.mix(VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) - } - /* - * SUBWORKFLOW: Structural variant calling - */ - if(!params.skip_sv) { - STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_index.map{ it [2] } ) - ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.sniffles_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.cutesv_version.first().ifEmpty(null)) - } + /* + * SUBWORKFLOW: Short variant calling + */ + if (params.call_variants && params.protocol == 'DNA' && !params.skip_vc) { + SHORT_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) + ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.deepvariant_version.first().ifEmpty(null)) + } + + /* + * SUBWORKFLOW: Structural variant calling + */ + if (params.call_variants && params.protocol == 'DNA' && !params.skip_sv) { + STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) + ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.sniffles_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.cutesv_version.first().ifEmpty(null)) } + ch_bedtools_version = Channel.empty() if (!params.skip_bigwig){ From b625318f9ca3368b4f0dc27bb6a69c31398324cd Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 24 Mar 2022 16:29:35 +0100 Subject: [PATCH 096/169] Profile check --- subworkflows/local/short_variant_calling.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index d972c95b..f4f28975 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -1,5 +1,5 @@ /* - * Short variant calling + * Short variant calling test */ include { GET_CHROM_NAMES } from '../../modules/local/get_chrom_names' From ffda46eb74027800bce54dcf5bd472fc12719674 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 24 Mar 2022 16:33:42 +0100 Subject: [PATCH 097/169] Change config --- conf/test_nobc_nodx_vc.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 88d2c324..4ca3a99a 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -25,5 +25,5 @@ params { call_variants = true variant_caller = 'medaka' - structural_variant_caller = 'sniffles' + structural_variant_caller = 'cutesv' } From 9ef8cfba8c813b04061a1a4176890ef53c4d006f Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 24 Mar 2022 16:36:42 +0100 Subject: [PATCH 098/169] Test test --- conf/test_nobc_nodx_vc.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 4ca3a99a..88d2c324 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -25,5 +25,5 @@ params { call_variants = true variant_caller = 'medaka' - structural_variant_caller = 'cutesv' + structural_variant_caller = 'sniffles' } From 64620bd07b556a316a5808af3f2222bcf88a8e51 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 24 Mar 2022 19:18:46 +0100 Subject: [PATCH 099/169] Update readme --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index a2676407..726eeff3 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,8 @@ On release, automated continuous integration tests run the pipeline on a [full-s * Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation 7. DNA-specific downstream analysis: - * DNA variant calling ([`medaka`](https://github.com/nanoporetech/medaka) and/or [`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) + * DNA short variant calling ([`medaka`](https://github.com/nanoporetech/medaka)) + * DNA structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) 8. RNA-specific downstream analysis: * Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) * bambu performs both transcript reconstruction and quantification. From e8c40e08c519431115bdbbf9ff2fc0f4005e2b6f Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 25 Mar 2022 07:30:24 +0100 Subject: [PATCH 100/169] Update readme --- README.md | 4 ++-- modules/local/get_chrom_names.nf | 2 +- subworkflows/local/prepare_genome.nf | 4 ++-- subworkflows/local/short_variant_calling.nf | 2 +- subworkflows/local/structural_variant_calling.nf | 7 +++---- 5 files changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 726eeff3..93631365 100644 --- a/README.md +++ b/README.md @@ -42,8 +42,8 @@ On release, automated continuous integration tests run the pipeline on a [full-s * Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation 7. DNA-specific downstream analysis: - * DNA short variant calling ([`medaka`](https://github.com/nanoporetech/medaka)) - * DNA structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) + * Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka) or [`deepvariant`](https://github.com/google/deepvariant)) + * Structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles) [`cutesv`](https://github.com/tjiangHIT/cuteSV)) 8. RNA-specific downstream analysis: * Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) * bambu performs both transcript reconstruction and quantification. diff --git a/modules/local/get_chrom_names.nf b/modules/local/get_chrom_names.nf index 79c40e8e..a7c85ccf 100644 --- a/modules/local/get_chrom_names.nf +++ b/modules/local/get_chrom_names.nf @@ -21,4 +21,4 @@ process GET_CHROM_NAMES { samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ -} \ No newline at end of file +} diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 4138dfa7..04a8b1e7 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -48,7 +48,7 @@ workflow PREPARE_GENOME { .map { it -> [ it[5], it[0], it[6], it[1], it[7], it[8] ]} // [ fasta, sizes, gtf, bed, is_transcripts, annotation_str ] .unique() .set { ch_fasta_index } - + /* * Convert GTF to BED12 */ @@ -57,7 +57,7 @@ workflow PREPARE_GENOME { .map { it -> [ it[0], it[2] ] } // [ gtf, annotation_str ] .unique() .set { ch_fasta } - + SAMTOOLS_FAIDX ( ch_fasta ) ch_fai = SAMTOOLS_FAIDX.out.fai diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index f4f28975..39e0b847 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -50,7 +50,7 @@ workflow SHORT_VARIANT_CALLING { new_meta.chr = chroms [new_meta, bam, bai, chroms] }.set { ch_view_sortbam_split } - + //ch_view_sortbam //.combine( ch_chrom_names ) //.unique() diff --git a/subworkflows/local/structural_variant_calling.nf b/subworkflows/local/structural_variant_calling.nf index 3f535217..cc2908e1 100644 --- a/subworkflows/local/structural_variant_calling.nf +++ b/subworkflows/local/structural_variant_calling.nf @@ -21,7 +21,6 @@ workflow STRUCTURAL_VARIANT_CALLING { main: ch_sv_calls_vcf = Channel.empty() ch_sv_calls_vcf_tbi = Channel.empty() - sniffles_version = Channel.empty() cutesv_version = Channel.empty() bgzip_version = Channel.empty() @@ -47,7 +46,7 @@ workflow STRUCTURAL_VARIANT_CALLING { new_meta.chr = chroms [new_meta, bam, bai, chroms] }.set { ch_view_sortbam_split } - + /* * Call structural variants */ @@ -76,7 +75,7 @@ workflow STRUCTURAL_VARIANT_CALLING { CUTESV_BGZIP_VCF( CUTESV.out.sv_calls ) ch_sv_calls_vcf = CUTESV_BGZIP_VCF.out.gz bgzip_version = CUTESV_BGZIP_VCF.out.versions - + CUTESV_TABIX_VCF( ch_sv_calls_vcf ) ch_sv_calls_tbi = CUTESV_TABIX_VCF.out.tbi tabix_version = CUTESV_TABIX_VCF.out.versions @@ -91,4 +90,4 @@ workflow STRUCTURAL_VARIANT_CALLING { sniffles_version cutesv_version -} \ No newline at end of file +} From 03c728acbcc7298e175567815a852db2f0c8cf4d Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 25 Mar 2022 07:41:32 +0100 Subject: [PATCH 101/169] Adding new config --- conf/test_nobc_nodx_vc.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 88d2c324..db520a3d 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -24,6 +24,6 @@ params { skip_demultiplexing = true call_variants = true - variant_caller = 'medaka' - structural_variant_caller = 'sniffles' + variant_caller = 'deepvariant' + structural_variant_caller = 'cutesv' } From ac4f296f7ed4e1543619deeb028338137d226476 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 25 Mar 2022 09:55:09 +0100 Subject: [PATCH 102/169] Added pepper_margin_deepvariant --- conf/modules.config | 13 +++++ conf/test_nobc_nodx_vc.config | 2 +- modules.json | 3 ++ modules/local/deepvariant.nf | 2 +- modules/local/pepper_margin_deepvariant | 48 +++++++++++++++++++ subworkflows/local/bam_sort_index_samtools.nf | 2 +- subworkflows/local/short_variant_calling.nf | 41 ++++++++-------- .../local/structural_variant_calling.nf | 1 + workflows/nanoseq.nf | 6 ++- 9 files changed, 93 insertions(+), 25 deletions(-) create mode 100644 modules/local/pepper_margin_deepvariant diff --git a/conf/modules.config b/conf/modules.config index 6e9ca8a6..0c8e2a2c 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -460,6 +460,19 @@ if (params.call_variants) { } } } + if (params.variant_caller == 'pepper_margin_deepvariant') { + process { + withName: PEPPER_MARGIN_DEEPVARIANT { + ext.args = { "--ont_r9_guppy5_sup" } + publishDir = [ + path: { "${params.outdir}/variant_calling/margin_pepper_deepvariant" }, + mode: 'copy', + enabled: true, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + } if (params.structural_variant_caller == 'sniffles') { process { withName: SNIFFLES { diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index db520a3d..9b7886cb 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -24,6 +24,6 @@ params { skip_demultiplexing = true call_variants = true - variant_caller = 'deepvariant' + variant_caller = 'pepper_margin_deepvariant' structural_variant_caller = 'cutesv' } diff --git a/modules.json b/modules.json index bba597b4..6c2e23b0 100644 --- a/modules.json +++ b/modules.json @@ -39,6 +39,9 @@ "tabix/bgzip": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "tabix/bgziptabix": { + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" + }, "tabix/tabix": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, diff --git a/modules/local/deepvariant.nf b/modules/local/deepvariant.nf index 9e4fad74..2cc9a81c 100644 --- a/modules/local/deepvariant.nf +++ b/modules/local/deepvariant.nf @@ -1,6 +1,6 @@ process DEEPVARIANT { tag "$meta.id" - label 'process_medium' + label 'process_high' if (params.enable_conda) { diff --git a/modules/local/pepper_margin_deepvariant b/modules/local/pepper_margin_deepvariant new file mode 100644 index 00000000..5030b74b --- /dev/null +++ b/modules/local/pepper_margin_deepvariant @@ -0,0 +1,48 @@ +process PEPPER_MARGIN_DEEPVARIANT { + tag "$meta.id" + label 'process_high' + + + if (params.enable_conda) { + exit 1, "Conda environments cannot be used when using the PEPPER_MARGIN_DEEPVARIANT tool. Please use docker or singularity containers." + } + + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'docker.io/kishwars/pepper_deepvariant:r0.8' : + 'docker.io/kishwars/pepper_deepvariant:r0.8' }" + + input: + tuple val(meta), path(input), path(index), val(intervals) + path(fasta) + path(fai) + + output: + tuple val(meta), path("${prefix}/*vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}/*vcf.gz.tbi") , emit: tbi + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" + def regions = intervals ? "--regions ${intervals}" : "" + + """ + mkdir -p "${prefix}" + + run_pepper_margin_deepvariant call_variant \\ + -b "${input}" \\ + -f "${fasta}" \\ + -o "${prefix}" \\ + -p "${prefix}" \\ + -t ${task.cpus} \\ + $args + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' ) + END_VERSIONS + """ +} diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index 9971a86a..54f5d51a 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -22,7 +22,7 @@ workflow BAM_SORT_INDEX_SAMTOOLS { .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } .set { sortbam } BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT_INDEX.out.bam_bai ) - } else{ + } else { SAMTOOLS_SORT ( SAMTOOLS_VIEW_BAM.out.bam ) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) ch_sam diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index 39e0b847..94ef2515 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -9,8 +9,7 @@ include { TABIX_TABIX as MEDAKA_TABIX_VCF } from '../../modules/nf-core/mo include { DEEPVARIANT } from '../../modules/local/deepvariant' include { TABIX_TABIX as DEEPVARIANT_TABIX_VCF } from '../../modules/nf-core/modules/tabix/tabix/main' include { TABIX_TABIX as DEEPVARIANT_TABIX_GVCF } from '../../modules/nf-core/modules/tabix/tabix/main' -include { SNIFFLES } from '../../modules/local/sniffles' -include { CUTESV } from '../../modules/local/cutesv' +include { PEPPER_MARGIN_DEEPVARIANT } from '../../modules/local/pepper_margin_deepvariant' workflow SHORT_VARIANT_CALLING { @@ -20,15 +19,16 @@ workflow SHORT_VARIANT_CALLING { ch_fai main: - ch_short_calls_vcf = Channel.empty() - ch_short_calls_vcf_tbi = Channel.empty() - ch_short_calls_gvcf = Channel.empty() - ch_short_calls_gvcf_tbi = Channel.empty() + ch_short_calls_vcf = Channel.empty() + ch_short_calls_vcf_tbi = Channel.empty() + ch_short_calls_gvcf = Channel.empty() + ch_short_calls_gvcf_tbi = Channel.empty() - medaka_version = Channel.empty() - deepvariant_version = Channel.empty() - bgzip_version = Channel.empty() - tabix_version = Channel.empty() + medaka_version = Channel.empty() + deepvariant_version = Channel.empty() + bgzip_version = Channel.empty() + tabix_version = Channel.empty() + peppermargindeepvariant_version = Channel.empty() /* * Get names of chromosomes from bam file @@ -51,17 +51,10 @@ workflow SHORT_VARIANT_CALLING { [new_meta, bam, bai, chroms] }.set { ch_view_sortbam_split } - //ch_view_sortbam - //.combine( ch_chrom_names ) - //.unique() - //.map{ meta, sizes, is_transcripts, bam, bai, chroms -> - //[meta, bam, bai, chroms ] - //}.set{ ch_view_sortbam_split } - /* * Call short variants */ - if (params.variant_caller == 'medaka'){ + if (params.variant_caller == 'medaka') { /* * MEDAKA */ @@ -76,7 +69,7 @@ workflow SHORT_VARIANT_CALLING { ch_short_calls_vcf_tbi = MEDAKA_TABIX_VCF.out.tbi tabix_version = MEDAKA_TABIX_VCF.out.versions - } else { + } else if (params.variant_caller == 'deepvariant') { /* * DEEPVARIANT */ @@ -92,10 +85,17 @@ workflow SHORT_VARIANT_CALLING { DEEPVARIANT_TABIX_GVCF( ch_short_calls_gvcf ) ch_short_calls_gvcf_tbi = DEEPVARIANT_TABIX_GVCF.out.tbi tabix_version = DEEPVARIANT_TABIX_VCF.out.versions + } else { + /* + * PEPPER_MARGIN_DEEPVARIANT + */ + PEPPER_MARGIN_DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) + ch_short_calls_vcf = PEPPER_MARGIN_DEEPVARIANT.out.vcf + ch_short_calls_vcf_tbi = PEPPER_MARGIN_DEEPVARIANT.out.tbi + peppermargindeepvariant_version = PEPPER_MARGIN_DEEPVARIANT.out.versions } - emit: ch_short_calls_vcf ch_short_calls_vcf_tbi @@ -105,5 +105,6 @@ workflow SHORT_VARIANT_CALLING { tabix_version medaka_version deepvariant_version + peppermargindeepvariant_version } diff --git a/subworkflows/local/structural_variant_calling.nf b/subworkflows/local/structural_variant_calling.nf index cc2908e1..7fd28b04 100644 --- a/subworkflows/local/structural_variant_calling.nf +++ b/subworkflows/local/structural_variant_calling.nf @@ -21,6 +21,7 @@ workflow STRUCTURAL_VARIANT_CALLING { main: ch_sv_calls_vcf = Channel.empty() ch_sv_calls_vcf_tbi = Channel.empty() + sniffles_version = Channel.empty() cutesv_version = Channel.empty() bgzip_version = Channel.empty() diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 21039235..0b76785d 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -78,8 +78,8 @@ if (params.call_variants) { if (params.protocol != 'DNA') { exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA'" } - if (!params.skip_vc && params.variant_caller != 'medaka' && params.variant_caller != 'deepvariant') { - exit 1, "Invalid variant caller option: ${params.variant_caller}. Valid options: 'medaka' or 'deepvariant'" + if (!params.skip_vc && params.variant_caller != 'medaka' && params.variant_caller != 'deepvariant' && params.variant_caller != 'pepper_margin_deepvariant') { + exit 1, "Invalid variant caller option: ${params.variant_caller}. Valid options: 'medaka', 'deepvariant' or 'pepper_margin_deepvariant'" } if (!params.skip_sv && params.structural_variant_caller != 'sniffles' && params.structural_variant_caller != 'cutesv') { exit 1, "Invalid structural variant caller option: ${params.structural_variant_caller}. Valid options: 'sniffles', 'cutesv" @@ -350,6 +350,8 @@ workflow NANOSEQ{ SHORT_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.deepvariant_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.peppermargindeepvariant_version.first().ifEmpty(null)) + } /* From 45fd64ef4b637a0242a57ef23729ec9cd9ee54e5 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 25 Mar 2022 10:46:56 +0100 Subject: [PATCH 103/169] Moved versions to ch_version --- CITATIONS.md | 9 +++++++ subworkflows/local/short_variant_calling.nf | 25 +++++++++---------- .../local/structural_variant_calling.nf | 22 ++++++---------- workflows/nanoseq.nf | 8 ++---- 4 files changed, 31 insertions(+), 33 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 0f046eef..97291d01 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -13,6 +13,12 @@ * [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. +* [cuteSV](https://pubmed.ncbi.nlm.nih.gov/32746918/) + > Jiang T, Liu Y, Jiang Y, Li J, Gao Y, Cui Z, Liu Y, Liu B, Wang Y. Long-read-based human genomic structural variation detection with cuteSV. Genome Biol. 2020 Aug 3;21(1):189. doi: 10.1186/s13059-020-02107-y. PMID: 32746918; PMCID: PMC7477834. + +* [DeepVariant](https://pubmed.ncbi.nlm.nih.gov/30247488/) + > Poplin R, Chang PC, Alexander D, Schwartz S, Colthurst T, Ku A, Newburger D, Dijamco J, Nguyen N, Afshar PT, Gross SS, Dorfman L, McLean CY, DePristo MA. A universal SNP and small-indel variant caller using deep neural networks. Nat Biotechnol. 2018 Nov;36(10):983-987. doi: 10.1038/nbt.4235. Epub 2018 Sep 24. PMID: 30247488. + * [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) * [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) @@ -43,6 +49,9 @@ * [NanoPlot](https://pubmed.ncbi.nlm.nih.gov/29547981/) > De Coster W, D'Hert S, Schultz DT, Cruts M, Van Broeckhoven C. NanoPack: visualizing and processing long-read sequencing data. Bioinformatics. 2018 Aug 1;34(15):2666-2669. doi: 10.1093/bioinformatics/bty149. PubMed PMID: 29547981; PubMed Central PMCID: PMC6061794. +* [PEPPER-Margin-DeepVariant](https://pubmed.ncbi.nlm.nih.gov/34725481/) + > Shafin K, Pesout T, Chang PC, Nattestad M, Kolesnikov A, Goel S, Baid G, Kolmogorov M, Eizenga JM, Miga KH, Carnevali P, Jain M, Carroll A, Paten B. Haplotype-aware variant calling with PEPPER-Margin-DeepVariant enables high accuracy in nanopore long-reads. Nat Methods. 2021 Nov;18(11):1322-1332. doi: 10.1038/s41592-021-01299-w. Epub 2021 Nov 1. PMID: 34725481; PMCID: PMC8571015. + * [pycoQC](https://doi.org/10.21105/joss.01236) > Leger A, Leonardi T, (2019). pycoQC, interactive quality control for Oxford Nanopore Sequencing. Journal of Open Source Software, 4(34), 1236. diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index 94ef2515..d52b1b7e 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -19,6 +19,8 @@ workflow SHORT_VARIANT_CALLING { ch_fai main: + ch_versions = Channel.empty() + ch_short_calls_vcf = Channel.empty() ch_short_calls_vcf_tbi = Channel.empty() ch_short_calls_gvcf = Channel.empty() @@ -31,7 +33,7 @@ workflow SHORT_VARIANT_CALLING { peppermargindeepvariant_version = Channel.empty() /* - * Get names of chromosomes from bam file + * Get chromosomes from bam file for splitting calling */ GET_CHROM_NAMES( ch_view_sortbam ) ch_chrom_names = GET_CHROM_NAMES.out.chrom_names @@ -59,15 +61,15 @@ workflow SHORT_VARIANT_CALLING { * MEDAKA */ MEDAKA_VARIANT( ch_view_sortbam_split, ch_fasta ) - medaka_version = MEDAKA_VARIANT.out.versions + ch_versions = ch_versions.mix(medaka_version = MEDAKA_VARIANT.out.versions) MEDAKA_BGZIP_VCF( MEDAKA_VARIANT.out.vcf ) ch_short_calls_vcf = MEDAKA_BGZIP_VCF.out.gz - bgzip_version = MEDAKA_BGZIP_VCF.out.versions + ch_versions = ch_versions.mix(bgzip_version = MEDAKA_BGZIP_VCF.out.versions) MEDAKA_TABIX_VCF( ch_short_calls_vcf ) ch_short_calls_vcf_tbi = MEDAKA_TABIX_VCF.out.tbi - tabix_version = MEDAKA_TABIX_VCF.out.versions + ch_versions = ch_versions.mix(tabix_version = MEDAKA_TABIX_VCF.out.versions) } else if (params.variant_caller == 'deepvariant') { /* @@ -76,15 +78,16 @@ workflow SHORT_VARIANT_CALLING { DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) ch_short_calls_vcf = DEEPVARIANT.out.vcf ch_short_calls_gvcf = DEEPVARIANT.out.gvcf - deepvariant_version = DEEPVARIANT.out.versions + ch_versions = ch_versions.mix(DEEPVARIANT.out.versions) DEEPVARIANT_TABIX_VCF( ch_short_calls_vcf ) ch_short_calls_vcf_tbi = DEEPVARIANT_TABIX_VCF.out.tbi - tabix_version = DEEPVARIANT_TABIX_VCF.out.versions + ch_versions = ch_versions.mix(DEEPVARIANT_TABIX_VCF.out.versions) DEEPVARIANT_TABIX_GVCF( ch_short_calls_gvcf ) ch_short_calls_gvcf_tbi = DEEPVARIANT_TABIX_GVCF.out.tbi - tabix_version = DEEPVARIANT_TABIX_VCF.out.versions + ch_versions = ch_versions.mix(DEEPVARIANT_TABIX_VCF.out.versions) + } else { /* * PEPPER_MARGIN_DEEPVARIANT @@ -92,7 +95,7 @@ workflow SHORT_VARIANT_CALLING { PEPPER_MARGIN_DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) ch_short_calls_vcf = PEPPER_MARGIN_DEEPVARIANT.out.vcf ch_short_calls_vcf_tbi = PEPPER_MARGIN_DEEPVARIANT.out.tbi - peppermargindeepvariant_version = PEPPER_MARGIN_DEEPVARIANT.out.versions + ch_versions = ch_versions.mix(PEPPER_MARGIN_DEEPVARIANT.out.versions) } @@ -101,10 +104,6 @@ workflow SHORT_VARIANT_CALLING { ch_short_calls_vcf_tbi ch_short_calls_gvcf ch_short_calls_gvcf_tbi - bgzip_version - tabix_version - medaka_version - deepvariant_version - peppermargindeepvariant_version + ch_versions } diff --git a/subworkflows/local/structural_variant_calling.nf b/subworkflows/local/structural_variant_calling.nf index 7fd28b04..67793049 100644 --- a/subworkflows/local/structural_variant_calling.nf +++ b/subworkflows/local/structural_variant_calling.nf @@ -22,10 +22,7 @@ workflow STRUCTURAL_VARIANT_CALLING { ch_sv_calls_vcf = Channel.empty() ch_sv_calls_vcf_tbi = Channel.empty() - sniffles_version = Channel.empty() - cutesv_version = Channel.empty() - bgzip_version = Channel.empty() - tabix_version = Channel.empty() + ch_versions = Channel.empty() /* * Get names of chromosomes from bam file @@ -56,39 +53,36 @@ workflow STRUCTURAL_VARIANT_CALLING { * SNIFFLES */ SNIFFLES( ch_view_sortbam ) - sniffles_version = SNIFFLES.out.versions + ch_versions = ch_versions.mix(SNIFFLES.out.versions) SNIFFLES_BGZIP_VCF( SNIFFLES.out.sv_calls ) ch_sv_calls_vcf = SNIFFLES_BGZIP_VCF.out.gz - bgzip_version = SNIFFLES_BGZIP_VCF.out.versions + ch_versions = ch_versions.mix(SNIFFLES_BGZIP_VCF.out.versions) SNIFFLES_TABIX_VCF( ch_sv_calls_vcf ) ch_sv_calls_tbi = SNIFFLES_TABIX_VCF.out.tbi - tabix_version = SNIFFLES_TABIX_VCF.out.versions + ch_versions = ch_versions.mix(SNIFFLES_TABIX_VCF.out.versions) } else { /* * CUTESV */ CUTESV( ch_view_sortbam, ch_fasta ) - cutesv_version = CUTESV.out.versions + ch_versions = ch_versions.mix(CUTESV.out.versions) CUTESV_BGZIP_VCF( CUTESV.out.sv_calls ) ch_sv_calls_vcf = CUTESV_BGZIP_VCF.out.gz - bgzip_version = CUTESV_BGZIP_VCF.out.versions + ch_versions = ch_versions.mix(CUTESV_BGZIP_VCF.out.versions) CUTESV_TABIX_VCF( ch_sv_calls_vcf ) ch_sv_calls_tbi = CUTESV_TABIX_VCF.out.tbi - tabix_version = CUTESV_TABIX_VCF.out.versions + ch_versions = ch_versions.mix(CUTESV_TABIX_VCF.out.versions) } emit: ch_sv_calls_vcf ch_sv_calls_vcf_tbi - bgzip_version - tabix_version - sniffles_version - cutesv_version + ch_versions } diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 0b76785d..17d607dc 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -348,10 +348,7 @@ workflow NANOSEQ{ */ if (params.call_variants && params.protocol == 'DNA' && !params.skip_vc) { SHORT_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) - ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.medaka_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.deepvariant_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.peppermargindeepvariant_version.first().ifEmpty(null)) - + ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.ch_version.first().ifEmpty(null)) } /* @@ -359,8 +356,7 @@ workflow NANOSEQ{ */ if (params.call_variants && params.protocol == 'DNA' && !params.skip_sv) { STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) - ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.sniffles_version.first().ifEmpty(null)) - ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.cutesv_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.ch_version.first().ifEmpty(null)) } From 88376835f605d63a5463fce44e591fb320cddaf9 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 25 Mar 2022 12:35:16 +0100 Subject: [PATCH 104/169] Tidy --- README.md | 2 +- modules/local/deepvariant.nf | 10 +++++----- ...margin_deepvariant => pepper_margin_deepvariant.nf} | 9 +++++---- subworkflows/local/short_variant_calling.nf | 6 ------ workflows/nanoseq.nf | 5 ++--- 5 files changed, 13 insertions(+), 19 deletions(-) rename modules/local/{pepper_margin_deepvariant => pepper_margin_deepvariant.nf} (79%) diff --git a/README.md b/README.md index 93631365..bbe282b7 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ On release, automated continuous integration tests run the pipeline on a [full-s * Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation 7. DNA-specific downstream analysis: - * Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka) or [`deepvariant`](https://github.com/google/deepvariant)) + * Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka), [`deepvariant`](https://github.com/google/deepvariant), or [`pepper_deepvariant`](https://github.com/kishwarshafin/pepper)) * Structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles) [`cutesv`](https://github.com/tjiangHIT/cuteSV)) 8. RNA-specific downstream analysis: * Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) diff --git a/modules/local/deepvariant.nf b/modules/local/deepvariant.nf index 2cc9a81c..83f9172e 100644 --- a/modules/local/deepvariant.nf +++ b/modules/local/deepvariant.nf @@ -17,16 +17,16 @@ process DEEPVARIANT { path(fai) output: - tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf - tuple val(meta), path("${prefix}.g.vcf.gz"), emit: gvcf - path "versions.yml" , emit: versions + tuple val(meta), path("${prefix}.vcf.gz") , emit: vcf + tuple val(meta), path("${prefix}.g.vcf.gz") , emit: gvcf + path "versions.yml" , emit: versions when: task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" + def args = task.ext.args ?: '' + prefix = task.ext.prefix ?: "${meta.id}" def regions = intervals ? "--regions ${intervals}" : "" """ diff --git a/modules/local/pepper_margin_deepvariant b/modules/local/pepper_margin_deepvariant.nf similarity index 79% rename from modules/local/pepper_margin_deepvariant rename to modules/local/pepper_margin_deepvariant.nf index 5030b74b..8d307a79 100644 --- a/modules/local/pepper_margin_deepvariant +++ b/modules/local/pepper_margin_deepvariant.nf @@ -25,9 +25,10 @@ process PEPPER_MARGIN_DEEPVARIANT { task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' - prefix = task.ext.prefix ?: "${meta.id}" - def regions = intervals ? "--regions ${intervals}" : "" + def args = task.ext.args ?: "" + prefix = task.ext.prefix ?: "${meta.id}" + //def regions = intervals ? "--regions ${intervals}" : "" + //def gvcf = params.make_gvcf ? "--gvcf" : "" """ mkdir -p "${prefix}" @@ -42,7 +43,7 @@ process PEPPER_MARGIN_DEEPVARIANT { cat <<-END_VERSIONS > versions.yml "${task.process}": - deepvariant: \$(echo \$(/opt/deepvariant/bin/run_deepvariant --version) | sed 's/^.*version //; s/ .*\$//' ) + pepper_margin_deepvariant: \$(run_pepper_margin_deepvariant --version | sed 's/VERSION: //g') END_VERSIONS """ } diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index d52b1b7e..97bf5dbf 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -26,12 +26,6 @@ workflow SHORT_VARIANT_CALLING { ch_short_calls_gvcf = Channel.empty() ch_short_calls_gvcf_tbi = Channel.empty() - medaka_version = Channel.empty() - deepvariant_version = Channel.empty() - bgzip_version = Channel.empty() - tabix_version = Channel.empty() - peppermargindeepvariant_version = Channel.empty() - /* * Get chromosomes from bam file for splitting calling */ diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 17d607dc..6dd5a202 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -348,7 +348,7 @@ workflow NANOSEQ{ */ if (params.call_variants && params.protocol == 'DNA' && !params.skip_vc) { SHORT_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) - ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.ch_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) } /* @@ -356,10 +356,9 @@ workflow NANOSEQ{ */ if (params.call_variants && params.protocol == 'DNA' && !params.skip_sv) { STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) - ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.ch_version.first().ifEmpty(null)) + ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) } - ch_bedtools_version = Channel.empty() if (!params.skip_bigwig){ From 94b69bb64799011ccc758257b2aede3e0218ad1e Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 25 Mar 2022 16:49:41 +0100 Subject: [PATCH 105/169] Stable commit while you work out how to split chromosomes nicely --- README.md | 4 ++-- subworkflows/local/short_variant_calling.nf | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index c11f99ae..fbe92565 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ On release, automated continuous integration tests run the pipeline on a [full-s 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation 7. DNA-specific downstream analysis: * Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka), [`deepvariant`](https://github.com/google/deepvariant), or [`pepper_deepvariant`](https://github.com/kishwarshafin/pepper)) - * Structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles) [`cutesv`](https://github.com/tjiangHIT/cuteSV)) + * Structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles) or [`cutesv`](https://github.com/tjiangHIT/cuteSV)) 8. RNA-specific downstream analysis: * Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) * bambu performs both transcript reconstruction and quantification. @@ -96,7 +96,7 @@ An example input samplesheet for performing both basecalling and demultiplexing ## Credits -nf-core/nanoseq was originally written by [Chelsea Sawyer](https://github.com/csawye01) and [Harshil Patel](https://github.com/drpatelh) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) for use at [The Francis Crick Institute](https://www.crick.ac.uk/), London. Other primary contributors include [Laura Wratten](https://github.com/lwratten), [Ying Chen](https://github.com/cying111), [Yuk Kei Wan](https://github.com/yuukiiwa) and [Jonathan Goeke](https://github.com/jonathangoeke) from the [Genome Institute of Singapore](https://www.a-star.edu.sg/gis), [Christopher Hakkaart](https://github.com/christopher-hakkaart) from [Institute of Medical Genetics and Applied Genomics](https://www.medizin.uni-tuebingen.de/de/das-klinikum/einrichtungen/institute/medizinische-genetik-und-angewandte-genomik), Germany, [Johannes Alneberg](https://github.com/alneberg) and [Franziska Bonath](https://github.com/FranBonath) from [SciLifeLab](https://www.scilifelab.se/), Sweden. +nf-core/nanoseq was originally written by [Chelsea Sawyer](https://github.com/csawye01) and [Harshil Patel](https://github.com/drpatelh) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) for use at [The Francis Crick Institute](https://www.crick.ac.uk/), London. Other primary contributors include [Laura Wratten](https://github.com/lwratten), [Ying Chen](https://github.com/cying111), [Yuk Kei Wan](https://github.com/yuukiiwa) and [Jonathan Goeke](https://github.com/jonathangoeke) from the [Genome Institute of Singapore](https://www.a-star.edu.sg/gis), [Christopher Hakkaart](https://github.com/christopher-hakkaart) from [Institute of Medical Genetics and Applied Genomics](https://www.medizin.uni-tuebingen.de/de/das-klinikum/einrichtungen/institute/medizinische-genetik-und-angewandte-genomik), Germany, and [Johannes Alneberg](https://github.com/alneberg) and [Franziska Bonath](https://github.com/FranBonath) from [SciLifeLab](https://www.scilifelab.se/), Sweden. Many thanks to others who have helped out along the way too, including (but not limited to): [@crickbabs](https://github.com/crickbabs), [@AnnaSyme](https://github.com/AnnaSyme),[@ekushele](https://github.com/ekushele). diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index 97bf5dbf..3a436feb 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -19,12 +19,11 @@ workflow SHORT_VARIANT_CALLING { ch_fai main: - ch_versions = Channel.empty() - ch_short_calls_vcf = Channel.empty() ch_short_calls_vcf_tbi = Channel.empty() ch_short_calls_gvcf = Channel.empty() ch_short_calls_gvcf_tbi = Channel.empty() + ch_versions = Channel.empty() /* * Get chromosomes from bam file for splitting calling From 30da8a3b4acb41e89d122ebe78172b80da1f9bdb Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 21 Apr 2022 10:55:33 +0200 Subject: [PATCH 106/169] Linting fix --- .gitattributes | 2 - .github/CONTRIBUTING.md | 42 +- .github/ISSUE_TEMPLATE/config.yml | 1 + .github/PULL_REQUEST_TEMPLATE.md | 5 +- .github/workflows/linting.yml | 23 +- .github/workflows/linting_comment.yml | 1 - .gitignore | 1 + assets/multiqc_config.yaml | 2 +- assets/sendmail_template.txt | 40 +- docs/README.md | 4 +- lib/NfcoreSchema.groovy | 546 ++++++++++++++------------ 11 files changed, 361 insertions(+), 306 deletions(-) mode change 100755 => 100644 lib/NfcoreSchema.groovy diff --git a/.gitattributes b/.gitattributes index 050bb120..7fe55006 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,3 +1 @@ *.config linguist-language=nextflow -modules/nf-core/** linguist-generated -subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cdbebfc6..70a3ac75 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you'd like to write some code for nf-core/nanoseq, the standard workflow is a * If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/nanoseq repository](https://github.com/nf-core/nanoseq) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +4. Use `nf-core schema build .` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). @@ -68,19 +68,22 @@ If you wish to contribute a new step, please use the following coding standards: 1. Define the corresponding input channel into your new process from the expected previous process channel 2. Write the process block (see below). 3. Define the output channel if needed (see below). -4. Add any new parameters to `nextflow.config` with a default (see below). -5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). -6. Add sanity checks and validation for all relevant parameters. -7. Perform local tests to validate that the new code works as expected. -8. If applicable, add a new test command in `.github/workflow/ci.yml`. -9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. -10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. +4. Add any new flags/options to `nextflow.config` with a default (see below). +5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`). +6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). +7. Add sanity checks for all relevant parameters. +8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. +9. Do local tests that the new code works properly and as expected. +10. Add a new test command in `.github/workflow/ci.yaml`. +11. If applicable add a [MultiQC](https://https://multiqc.info/) module. +12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. +13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. ### Default values Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. -Once there, use `nf-core schema build` to add to `nextflow_schema.json`. +Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. ### Default processes resource requirements @@ -99,6 +102,27 @@ Please use the following naming schemes, to make it easy to understand what is g If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` +### Software version reporting + +If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. + +Add to the script block of the process, something like the following: + +```bash + --version &> v_.txt 2>&1 || true +``` + +or + +```bash + --help | head -n 1 &> v_.txt 2>&1 || true +``` + +You then need to edit the script `bin/scrape_software_versions.py` to: + +1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` +2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. + ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 74fd1b53..904ded2b 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,3 +1,4 @@ +blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8a21c35e..6df7b26d 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,9 +16,10 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/nano - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/nanoseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint`). +- [ ] Make sure your code lints (`nf-core lint .`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773..fcde400c 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -18,7 +18,7 @@ jobs: - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint - run: markdownlint . + run: markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -35,8 +35,8 @@ jobs: * On Mac: `brew install markdownlint-cli` * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) * Fix the markdown errors - * Automatically: `markdownlint . --fix` - * Manually resolve anything left from `markdownlint .` + * Automatically: `markdownlint . --config .github/markdownlint.yml --fix` + * Manually resolve anything left from `markdownlint . --config .github/markdownlint.yml` Once you push these changes the test should pass, and you can hide this comment :+1: @@ -46,20 +46,6 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - EditorConfig: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - - uses: actions/setup-node@v1 - with: - node-version: '10' - - - name: Install editorconfig-checker - run: npm install -g editorconfig-checker - - - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) YAML: runs-on: ubuntu-latest @@ -98,6 +84,7 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false + nf-core: runs-on: ubuntu-latest steps: @@ -127,7 +114,7 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 44d72994..90f03c6f 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,7 +15,6 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml - workflow_conclusion: completed - name: Get PR number id: pr_number diff --git a/.gitignore b/.gitignore index 5124c9ac..aa4bb5b3 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ work/ data/ results/ .DS_Store +tests/ testing/ testing* *.pyc diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 365f1651..35b33cc7 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > This report has been generated by the nf-core/nanoseq analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: software_versions: order: -1000 diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 5047c306..4ca4ff20 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -12,18 +12,18 @@ $email_html Content-Type: image/png;name="nf-core-nanoseq_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="nf-core-nanoseq_logo_light.png" +Content-Disposition: inline; filename="nf-core-nanoseq_logo.png" -<% out << new File("$projectDir/assets/nf-core-nanoseq_logo_light.png"). - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' ) %> +<% out << new File("$projectDir/assets/nf-core-nanoseq_logo.png"). + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> <% if (mqcFile){ @@ -37,15 +37,15 @@ Content-ID: Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" ${mqcFileObj. - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' )} + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' )} """ }} %> diff --git a/docs/README.md b/docs/README.md index cd206cc8..eabd5d5e 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,8 +3,8 @@ The nf-core/nanoseq documentation is split into the following pages: * [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. + * An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy old mode 100755 new mode 100644 index 40ab65f2..52ee7304 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -1,6 +1,6 @@ -// -// This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. -// +/* + * This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. + */ import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader @@ -13,23 +13,16 @@ import groovy.json.JsonBuilder class NfcoreSchema { - // - // Resolve Schema path relative to main workflow directory - // - public static String getSchemaPath(workflow, schema_filename='nextflow_schema.json') { - return "${workflow.projectDir}/${schema_filename}" - } - - // - // Function to loop over all parameters defined in schema and check - // whether the given parameters adhere to the specifications - // + /* + * Function to loop over all parameters defined in schema and check + * whether the given paremeters adhere to the specificiations + */ /* groovylint-disable-next-line UnusedPrivateMethodParameter */ - public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { + private static void validateParameters(params, jsonSchema, log) { def has_error = false //=====================================================================// // Check for nextflow core params and unexpected params - def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text + def json = new File(jsonSchema).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') def nf_params = [ // Options for base `nextflow` command @@ -105,13 +98,9 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] - def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) - if (group.value['properties'][p.key].containsKey('enum')) { - enums[p.key] = group.value['properties'][p.key]['enum'] - } } } @@ -125,8 +114,7 @@ class NfcoreSchema { def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() - def isCamelCaseBug = (specifiedParam.contains("-") && !expectedParams.contains(specifiedParam) && expectedParamsLowerCase.contains(specifiedParamLowerCase)) - if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !isCamelCaseBug) { + if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !expectedParamsLowerCase.contains(specifiedParamLowerCase)) { // Temporarily remove camelCase/camel-case params #1035 def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ @@ -137,36 +125,36 @@ class NfcoreSchema { //=====================================================================// // Validate parameters against the schema - InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() - JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) + InputStream inputStream = new File(jsonSchema).newInputStream() + JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream)) // Remove anything that's in params.schema_ignore_params - raw_schema = removeIgnoredParams(raw_schema, params) + rawSchema = removeIgnoredParams(rawSchema, params) - Schema schema = SchemaLoader.load(raw_schema) + Schema schema = SchemaLoader.load(rawSchema) // Clean the parameters def cleanedParams = cleanParameters(params) // Convert to JSONObject def jsonParams = new JsonBuilder(cleanedParams) - JSONObject params_json = new JSONObject(jsonParams.toString()) + JSONObject paramsJSON = new JSONObject(jsonParams.toString()) // Validate try { - schema.validate(params_json) + schema.validate(paramsJSON) } catch (ValidationException e) { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, params_json, log, enums) + printExceptions(exceptionJSON, paramsJSON, log) println '' has_error = true } // Check for unexpected parameters if (unexpectedParams.size() > 0) { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) + Map colors = log_colours(params.monochrome_logs) println '' def warn_msg = 'Found unexpected parameters:' for (unexpectedParam in unexpectedParams) { @@ -182,17 +170,266 @@ class NfcoreSchema { } } - // - // Beautify parameters for --help - // - public static String paramsHelp(workflow, params, command, schema_filename='nextflow_schema.json') { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) + // Loop over nested exceptions and print the causingException + private static void printExceptions(exJSON, paramsJSON, log) { + def causingExceptions = exJSON['causingExceptions'] + if (causingExceptions.length() == 0) { + def m = exJSON['message'] =~ /required key \[([^\]]+)\] not found/ + // Missing required param + if (m.matches()) { + log.error "* Missing required parameter: --${m[0][1]}" + } + // Other base-level error + else if (exJSON['pointerToViolation'] == '#') { + log.error "* ${exJSON['message']}" + } + // Error with specific param + else { + def param = exJSON['pointerToViolation'] - ~/^#\// + def param_val = paramsJSON[param].toString() + log.error "* --${param}: ${exJSON['message']} (${param_val})" + } + } + for (ex in causingExceptions) { + printExceptions(ex, paramsJSON, log) + } + } + + // Remove an element from a JSONArray + private static JSONArray removeElement(jsonArray, element){ + def list = [] + int len = jsonArray.length() + for (int i=0;i + if(rawSchema.keySet().contains('definitions')){ + rawSchema.definitions.each { definition -> + for (key in definition.keySet()){ + if (definition[key].get("properties").keySet().contains(ignore_param)){ + // Remove the param to ignore + definition[key].get("properties").remove(ignore_param) + // If the param was required, change this + if (definition[key].has("required")) { + def cleaned_required = removeElement(definition[key].required, ignore_param) + definition[key].put("required", cleaned_required) + } + } + } + } + } + if(rawSchema.keySet().contains('properties') && rawSchema.get('properties').keySet().contains(ignore_param)) { + rawSchema.get("properties").remove(ignore_param) + } + if(rawSchema.keySet().contains('required') && rawSchema.required.contains(ignore_param)) { + def cleaned_required = removeElement(rawSchema.required, ignore_param) + rawSchema.put("required", cleaned_required) + } + } + return rawSchema + } + + private static Map cleanParameters(params) { + def new_params = params.getClass().newInstance(params) + for (p in params) { + // remove anything evaluating to false + if (!p['value']) { + new_params.remove(p.key) + } + // Cast MemoryUnit to String + if (p['value'].getClass() == nextflow.util.MemoryUnit) { + new_params.replace(p.key, p['value'].toString()) + } + // Cast Duration to String + if (p['value'].getClass() == nextflow.util.Duration) { + new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) + } + // Cast LinkedHashMap to String + if (p['value'].getClass() == LinkedHashMap) { + new_params.replace(p.key, p['value'].toString()) + } + } + return new_params + } + + /* + * This method tries to read a JSON params file + */ + private static LinkedHashMap params_load(String json_schema) { + def params_map = new LinkedHashMap() + try { + params_map = params_read(json_schema) + } catch (Exception e) { + println "Could not read parameters settings from JSON. $e" + params_map = new LinkedHashMap() + } + return params_map + } + + private static Map log_colours(Boolean monochrome_logs) { + Map colorcodes = [:] + + // Reset / Meta + colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" + colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" + colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" + colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" + colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" + colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" + colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" + + // Regular Colors + colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" + colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" + colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" + colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" + colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" + colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" + colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" + colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" + + // Bold + colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" + colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" + colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" + colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" + colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" + colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" + colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" + colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" + + // Underline + colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" + colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" + colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" + colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" + colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" + colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" + colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" + colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" + + // High Intensity + colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" + colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" + colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" + colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" + colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" + colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" + colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" + colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" + + // Bold High Intensity + colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" + colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" + colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" + colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" + colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" + colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" + colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" + colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" + + return colorcodes + } + + static String dashed_line(monochrome_logs) { + Map colors = log_colours(monochrome_logs) + return "-${colors.dim}----------------------------------------------------${colors.reset}-" + } + + /* + Method to actually read in JSON file using Groovy. + Group (as Key), values are all parameters + - Parameter1 as Key, Description as Value + - Parameter2 as Key, Description as Value + .... + Group + - + */ + private static LinkedHashMap params_read(String json_schema) throws Exception { + def json = new File(json_schema).text + def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') + def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') + /* Tree looks like this in nf-core schema + * definitions <- this is what the first get('definitions') gets us + group 1 + title + description + properties + parameter 1 + type + description + parameter 2 + type + description + group 2 + title + description + properties + parameter 1 + type + description + * properties <- parameters can also be ungrouped, outside of definitions + parameter 1 + type + description + */ + + // Grouped params + def params_map = new LinkedHashMap() + schema_definitions.each { key, val -> + def Map group = schema_definitions."$key".properties // Gets the property object of the group + def title = schema_definitions."$key".title + def sub_params = new LinkedHashMap() + group.each { innerkey, value -> + sub_params.put(innerkey, value) + } + params_map.put(title, sub_params) + } + + // Ungrouped params + def ungrouped_params = new LinkedHashMap() + schema_properties.each { innerkey, value -> + ungrouped_params.put(innerkey, value) + } + params_map.put("Other parameters", ungrouped_params) + + return params_map + } + + /* + * Get maximum number of characters across all parameter names + */ + private static Integer params_max_chars(params_map) { + Integer max_chars = 0 + for (group in params_map.keySet()) { + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (param.size() > max_chars) { + max_chars = param.size() + } + } + } + return max_chars + } + + /* + * Beautify parameters for --help + */ + private static String params_help(workflow, params, json_schema, command) { + Map colors = log_colours(params.monochrome_logs) Integer num_hidden = 0 String output = '' output += 'Typical pipeline command:\n\n' output += " ${colors.cyan}${command}${colors.reset}\n\n" - Map params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) - Integer max_chars = paramsMaxChars(params_map) + 1 + Map params_map = params_load(json_schema) + Integer max_chars = params_max_chars(params_map) + 1 Integer desc_indent = max_chars + 14 Integer dec_linewidth = 160 - desc_indent for (group in params_map.keySet()) { @@ -206,7 +443,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -232,17 +469,18 @@ class NfcoreSchema { output += group_output } } + output += dashed_line(params.monochrome_logs) if (num_hidden > 0){ - output += colors.dim + "!! Hiding $num_hidden params, use --show_hidden_params to show them !!\n" + colors.reset + output += colors.dim + "\n Hiding $num_hidden params, use --show_hidden_params to show.\n" + colors.reset + output += dashed_line(params.monochrome_logs) } - output += NfcoreTemplate.dashedLine(params.monochrome_logs) return output } - // - // Groovy Map summarising parameters/workflow options used by the pipeline - // - public static LinkedHashMap paramsSummaryMap(workflow, params, schema_filename='nextflow_schema.json') { + /* + * Groovy Map summarising parameters/workflow options used by the pipeline + */ + private static LinkedHashMap params_summary_map(workflow, params, json_schema) { // Get a selection of core Nextflow workflow options def Map workflow_summary = [:] if (workflow.revision) { @@ -264,12 +502,13 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) + def blacklist = ['hostnames'] + def params_map = params_load(json_schema) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param)) { + if (params.containsKey(param) && !blacklist.contains(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -307,14 +546,14 @@ class NfcoreSchema { return [ 'Core Nextflow options' : workflow_summary ] << params_summary } - // - // Beautify parameters for summary and return as string - // - public static String paramsSummaryLog(workflow, params) { - Map colors = NfcoreTemplate.logColours(params.monochrome_logs) + /* + * Beautify parameters for summary and return as string + */ + private static String params_summary_log(workflow, params, json_schema) { + Map colors = log_colours(params.monochrome_logs) String output = '' - def params_map = paramsSummaryMap(workflow, params) - def max_chars = paramsMaxChars(params_map) + def params_map = params_summary_map(workflow, params, json_schema) + def max_chars = params_max_chars(params_map) for (group in params_map.keySet()) { def group_params = params_map.get(group) // This gets the parameters of that particular group if (group_params) { @@ -325,205 +564,10 @@ class NfcoreSchema { output += '\n' } } - output += "!! Only displaying parameters that differ from the pipeline defaults !!\n" - output += NfcoreTemplate.dashedLine(params.monochrome_logs) + output += dashed_line(params.monochrome_logs) + output += colors.dim + "\n Only displaying parameters that differ from defaults.\n" + colors.reset + output += dashed_line(params.monochrome_logs) return output } - // - // Loop over nested exceptions and print the causingException - // - private static void printExceptions(ex_json, params_json, log, enums, limit=5) { - def causingExceptions = ex_json['causingExceptions'] - if (causingExceptions.length() == 0) { - def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ - // Missing required param - if (m.matches()) { - log.error "* Missing required parameter: --${m[0][1]}" - } - // Other base-level error - else if (ex_json['pointerToViolation'] == '#') { - log.error "* ${ex_json['message']}" - } - // Error with specific param - else { - def param = ex_json['pointerToViolation'] - ~/^#\// - def param_val = params_json[param].toString() - if (enums.containsKey(param)) { - def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" - if (enums[param].size() > limit) { - log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" - } else { - log.error "${error_msg}: ${enums[param].join(', ')})" - } - } else { - log.error "* --${param}: ${ex_json['message']} (${param_val})" - } - } - } - for (ex in causingExceptions) { - printExceptions(ex, params_json, log, enums) - } - } - - // - // Remove an element from a JSONArray - // - private static JSONArray removeElement(json_array, element) { - def list = [] - int len = json_array.length() - for (int i=0;i - if(raw_schema.keySet().contains('definitions')){ - raw_schema.definitions.each { definition -> - for (key in definition.keySet()){ - if (definition[key].get("properties").keySet().contains(ignore_param)){ - // Remove the param to ignore - definition[key].get("properties").remove(ignore_param) - // If the param was required, change this - if (definition[key].has("required")) { - def cleaned_required = removeElement(definition[key].required, ignore_param) - definition[key].put("required", cleaned_required) - } - } - } - } - } - if(raw_schema.keySet().contains('properties') && raw_schema.get('properties').keySet().contains(ignore_param)) { - raw_schema.get("properties").remove(ignore_param) - } - if(raw_schema.keySet().contains('required') && raw_schema.required.contains(ignore_param)) { - def cleaned_required = removeElement(raw_schema.required, ignore_param) - raw_schema.put("required", cleaned_required) - } - } - return raw_schema - } - - // - // Clean and check parameters relative to Nextflow native classes - // - private static Map cleanParameters(params) { - def new_params = params.getClass().newInstance(params) - for (p in params) { - // remove anything evaluating to false - if (!p['value']) { - new_params.remove(p.key) - } - // Cast MemoryUnit to String - if (p['value'].getClass() == nextflow.util.MemoryUnit) { - new_params.replace(p.key, p['value'].toString()) - } - // Cast Duration to String - if (p['value'].getClass() == nextflow.util.Duration) { - new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) - } - // Cast LinkedHashMap to String - if (p['value'].getClass() == LinkedHashMap) { - new_params.replace(p.key, p['value'].toString()) - } - } - return new_params - } - - // - // This function tries to read a JSON params file - // - private static LinkedHashMap paramsLoad(String json_schema) { - def params_map = new LinkedHashMap() - try { - params_map = paramsRead(json_schema) - } catch (Exception e) { - println "Could not read parameters settings from JSON. $e" - params_map = new LinkedHashMap() - } - return params_map - } - - // - // Method to actually read in JSON file using Groovy. - // Group (as Key), values are all parameters - // - Parameter1 as Key, Description as Value - // - Parameter2 as Key, Description as Value - // .... - // Group - // - - private static LinkedHashMap paramsRead(String json_schema) throws Exception { - def json = new File(json_schema).text - def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') - def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') - /* Tree looks like this in nf-core schema - * definitions <- this is what the first get('definitions') gets us - group 1 - title - description - properties - parameter 1 - type - description - parameter 2 - type - description - group 2 - title - description - properties - parameter 1 - type - description - * properties <- parameters can also be ungrouped, outside of definitions - parameter 1 - type - description - */ - - // Grouped params - def params_map = new LinkedHashMap() - schema_definitions.each { key, val -> - def Map group = schema_definitions."$key".properties // Gets the property object of the group - def title = schema_definitions."$key".title - def sub_params = new LinkedHashMap() - group.each { innerkey, value -> - sub_params.put(innerkey, value) - } - params_map.put(title, sub_params) - } - - // Ungrouped params - def ungrouped_params = new LinkedHashMap() - schema_properties.each { innerkey, value -> - ungrouped_params.put(innerkey, value) - } - params_map.put("Other parameters", ungrouped_params) - - return params_map - } - - // - // Get maximum number of characters across all parameter names - // - private static Integer paramsMaxChars(params_map) { - Integer max_chars = 0 - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (param.size() > max_chars) { - max_chars = param.size() - } - } - } - return max_chars - } } From 3ea4c411a1dbe10833154395fbffbce9109adcce Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 21 Apr 2022 15:37:26 +0200 Subject: [PATCH 107/169] Module lint --- .gitattributes | 2 + .github/CONTRIBUTING.md | 42 +- .github/ISSUE_TEMPLATE/config.yml | 1 - .github/PULL_REQUEST_TEMPLATE.md | 5 +- .github/workflows/linting.yml | 23 +- .github/workflows/linting_comment.yml | 1 + .gitignore | 1 - .nf-core.yml | 1 + assets/multiqc_config.yaml | 2 +- assets/sendmail_template.txt | 40 +- docs/README.md | 4 +- lib/NfcoreSchema.groovy | 546 ++++++++---------- modules.json | 24 +- .../custom/dumpsoftwareversions/main.nf | 3 + .../custom/dumpsoftwareversions/meta.yml | 2 +- modules/nf-core/modules/fastqc/main.nf | 15 + modules/nf-core/modules/fastqc/meta.yml | 90 +-- modules/nf-core/modules/nanolyse/main.nf | 5 +- modules/nf-core/modules/nanolyse/meta.yml | 80 +-- modules/nf-core/modules/pycoqc/main.nf | 5 +- modules/nf-core/modules/pycoqc/meta.yml | 2 +- .../nf-core/modules/samtools/flagstat/main.nf | 17 +- .../modules/samtools/flagstat/meta.yml | 85 ++- .../nf-core/modules/samtools/idxstats/main.nf | 16 +- .../modules/samtools/idxstats/meta.yml | 87 ++- .../nf-core/modules/samtools/index/main.nf | 29 +- .../nf-core/modules/samtools/index/meta.yml | 93 ++- modules/nf-core/modules/samtools/sort/main.nf | 24 +- .../nf-core/modules/samtools/sort/meta.yml | 75 ++- .../nf-core/modules/samtools/stats/main.nf | 33 +- .../nf-core/modules/samtools/stats/meta.yml | 91 ++- .../nf-core/modules/stringtie/merge/main.nf | 5 +- .../nf-core/modules/stringtie/merge/meta.yml | 58 +- modules/nf-core/modules/untar/main.nf | 37 +- modules/nf-core/modules/untar/meta.yml | 52 +- subworkflows/nf-core/bam_stats_samtools.nf | 2 +- 36 files changed, 830 insertions(+), 768 deletions(-) create mode 100644 .nf-core.yml mode change 100644 => 100755 lib/NfcoreSchema.groovy diff --git a/.gitattributes b/.gitattributes index 7fe55006..050bb120 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1,3 @@ *.config linguist-language=nextflow +modules/nf-core/** linguist-generated +subworkflows/nf-core/** linguist-generated diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 70a3ac75..cdbebfc6 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -19,7 +19,7 @@ If you'd like to write some code for nf-core/nanoseq, the standard workflow is a * If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/nanoseq repository](https://github.com/nf-core/nanoseq) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) -4. Use `nf-core schema build .` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). +4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). 5. Submit a Pull Request against the `dev` branch and wait for the code to be reviewed and merged If you're not used to this workflow with git, you can start with some [docs from GitHub](https://help.github.com/en/github/collaborating-with-issues-and-pull-requests) or even their [excellent `git` resources](https://try.github.io/). @@ -68,22 +68,19 @@ If you wish to contribute a new step, please use the following coding standards: 1. Define the corresponding input channel into your new process from the expected previous process channel 2. Write the process block (see below). 3. Define the output channel if needed (see below). -4. Add any new flags/options to `nextflow.config` with a default (see below). -5. Add any new flags/options to `nextflow_schema.json` with help text (with `nf-core schema build .`). -6. Add any new flags/options to the help message (for integer/text parameters, print to help the corresponding `nextflow.config` parameter). -7. Add sanity checks for all relevant parameters. -8. Add any new software to the `scrape_software_versions.py` script in `bin/` and the version command to the `scrape_software_versions` process in `main.nf`. -9. Do local tests that the new code works properly and as expected. -10. Add a new test command in `.github/workflow/ci.yaml`. -11. If applicable add a [MultiQC](https://https://multiqc.info/) module. -12. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, name clean up, General Statistics Table column order, and module figures are in the right order. -13. Optional: Add any descriptions of MultiQC report sections and output files to `docs/output.md`. +4. Add any new parameters to `nextflow.config` with a default (see below). +5. Add any new parameters to `nextflow_schema.json` with help text (via the `nf-core schema build` tool). +6. Add sanity checks and validation for all relevant parameters. +7. Perform local tests to validate that the new code works as expected. +8. If applicable, add a new test command in `.github/workflow/ci.yml`. +9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values Parameters should be initialised / defined with default values in `nextflow.config` under the `params` scope. -Once there, use `nf-core schema build .` to add to `nextflow_schema.json`. +Once there, use `nf-core schema build` to add to `nextflow_schema.json`. ### Default processes resource requirements @@ -102,27 +99,6 @@ Please use the following naming schemes, to make it easy to understand what is g If you are using a new feature from core Nextflow, you may bump the minimum required version of nextflow in the pipeline with: `nf-core bump-version --nextflow . [min-nf-version]` -### Software version reporting - -If you add a new tool to the pipeline, please ensure you add the information of the tool to the `get_software_version` process. - -Add to the script block of the process, something like the following: - -```bash - --version &> v_.txt 2>&1 || true -``` - -or - -```bash - --help | head -n 1 &> v_.txt 2>&1 || true -``` - -You then need to edit the script `bin/scrape_software_versions.py` to: - -1. Add a Python regex for your tool's `--version` output (as in stored in the `v_.txt` file), to ensure the version is reported as a `v` and the version number e.g. `v2.1.1` -2. Add a HTML entry to the `OrderedDict` for formatting in MultiQC. - ### Images and figures For overview images and other documents we follow the nf-core [style guidelines and examples](https://nf-co.re/developers/design_guidelines). diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 904ded2b..74fd1b53 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,4 +1,3 @@ -blank_issues_enabled: false contact_links: - name: Join nf-core url: https://nf-co.re/join diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 6df7b26d..8a21c35e 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -16,10 +16,9 @@ Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/nano - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - add to the software_versions process and a regex to `scrape_software_versions.py` - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) - [ ] If necessary, also make a PR on the nf-core/nanoseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. -- [ ] Make sure your code lints (`nf-core lint .`). +- [ ] Make sure your code lints (`nf-core lint`). - [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index fcde400c..3b448773 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -18,7 +18,7 @@ jobs: - name: Install markdownlint run: npm install -g markdownlint-cli - name: Run Markdownlint - run: markdownlint ${GITHUB_WORKSPACE} -c ${GITHUB_WORKSPACE}/.github/markdownlint.yml + run: markdownlint . # If the above check failed, post a comment on the PR explaining the failure - name: Post PR comment @@ -35,8 +35,8 @@ jobs: * On Mac: `brew install markdownlint-cli` * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) * Fix the markdown errors - * Automatically: `markdownlint . --config .github/markdownlint.yml --fix` - * Manually resolve anything left from `markdownlint . --config .github/markdownlint.yml` + * Automatically: `markdownlint . --fix` + * Manually resolve anything left from `markdownlint .` Once you push these changes the test should pass, and you can hide this comment :+1: @@ -46,6 +46,20 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false + EditorConfig: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - uses: actions/setup-node@v1 + with: + node-version: '10' + + - name: Install editorconfig-checker + run: npm install -g editorconfig-checker + + - name: Run ECLint check + run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) YAML: runs-on: ubuntu-latest @@ -84,7 +98,6 @@ jobs: repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - nf-core: runs-on: ubuntu-latest steps: @@ -114,7 +127,7 @@ jobs: GITHUB_COMMENTS_URL: ${{ github.event.pull_request.comments_url }} GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} GITHUB_PR_COMMIT: ${{ github.event.pull_request.head.sha }} - run: nf-core -l lint_log.txt lint ${GITHUB_WORKSPACE} --markdown lint_results.md + run: nf-core -l lint_log.txt lint --dir ${GITHUB_WORKSPACE} --markdown lint_results.md - name: Save PR number if: ${{ always() }} diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 90f03c6f..44d72994 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -15,6 +15,7 @@ jobs: uses: dawidd6/action-download-artifact@v2 with: workflow: linting.yml + workflow_conclusion: completed - name: Get PR number id: pr_number diff --git a/.gitignore b/.gitignore index aa4bb5b3..5124c9ac 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,6 @@ work/ data/ results/ .DS_Store -tests/ testing/ testing* *.pyc diff --git a/.nf-core.yml b/.nf-core.yml new file mode 100644 index 00000000..3805dc81 --- /dev/null +++ b/.nf-core.yml @@ -0,0 +1 @@ +repository_type: pipeline diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 35b33cc7..365f1651 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,7 +1,7 @@ report_comment: > This report has been generated by the nf-core/nanoseq analysis pipeline. For information about how to interpret these results, please see the - documentation. + documentation. report_section_order: software_versions: order: -1000 diff --git a/assets/sendmail_template.txt b/assets/sendmail_template.txt index 4ca4ff20..5047c306 100644 --- a/assets/sendmail_template.txt +++ b/assets/sendmail_template.txt @@ -12,18 +12,18 @@ $email_html Content-Type: image/png;name="nf-core-nanoseq_logo.png" Content-Transfer-Encoding: base64 Content-ID: -Content-Disposition: inline; filename="nf-core-nanoseq_logo.png" +Content-Disposition: inline; filename="nf-core-nanoseq_logo_light.png" -<% out << new File("$projectDir/assets/nf-core-nanoseq_logo.png"). - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' ) %> +<% out << new File("$projectDir/assets/nf-core-nanoseq_logo_light.png"). + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' ) %> <% if (mqcFile){ @@ -37,15 +37,15 @@ Content-ID: Content-Disposition: attachment; filename=\"${mqcFileObj.getName()}\" ${mqcFileObj. - bytes. - encodeBase64(). - toString(). - tokenize( '\n' )*. - toList()*. - collate( 76 )*. - collect { it.join() }. - flatten(). - join( '\n' )} + bytes. + encodeBase64(). + toString(). + tokenize( '\n' )*. + toList()*. + collate( 76 )*. + collect { it.join() }. + flatten(). + join( '\n' )} """ }} %> diff --git a/docs/README.md b/docs/README.md index eabd5d5e..cd206cc8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -3,8 +3,8 @@ The nf-core/nanoseq documentation is split into the following pages: * [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. + * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. * [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. + * An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy old mode 100644 new mode 100755 index 52ee7304..40ab65f2 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -1,6 +1,6 @@ -/* - * This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. - */ +// +// This file holds several functions used to perform JSON parameter validation, help and summary rendering for the nf-core pipeline template. +// import org.everit.json.schema.Schema import org.everit.json.schema.loader.SchemaLoader @@ -13,16 +13,23 @@ import groovy.json.JsonBuilder class NfcoreSchema { - /* - * Function to loop over all parameters defined in schema and check - * whether the given paremeters adhere to the specificiations - */ + // + // Resolve Schema path relative to main workflow directory + // + public static String getSchemaPath(workflow, schema_filename='nextflow_schema.json') { + return "${workflow.projectDir}/${schema_filename}" + } + + // + // Function to loop over all parameters defined in schema and check + // whether the given parameters adhere to the specifications + // /* groovylint-disable-next-line UnusedPrivateMethodParameter */ - private static void validateParameters(params, jsonSchema, log) { + public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false //=====================================================================// // Check for nextflow core params and unexpected params - def json = new File(jsonSchema).text + def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') def nf_params = [ // Options for base `nextflow` command @@ -98,9 +105,13 @@ class NfcoreSchema { // Collect expected parameters from the schema def expectedParams = [] + def enums = [:] for (group in schemaParams) { for (p in group.value['properties']) { expectedParams.push(p.key) + if (group.value['properties'][p.key].containsKey('enum')) { + enums[p.key] = group.value['properties'][p.key]['enum'] + } } } @@ -114,7 +125,8 @@ class NfcoreSchema { def params_ignore = params.schema_ignore_params.split(',') + 'schema_ignore_params' def expectedParamsLowerCase = expectedParams.collect{ it.replace("-", "").toLowerCase() } def specifiedParamLowerCase = specifiedParam.replace("-", "").toLowerCase() - if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !expectedParamsLowerCase.contains(specifiedParamLowerCase)) { + def isCamelCaseBug = (specifiedParam.contains("-") && !expectedParams.contains(specifiedParam) && expectedParamsLowerCase.contains(specifiedParamLowerCase)) + if (!expectedParams.contains(specifiedParam) && !params_ignore.contains(specifiedParam) && !isCamelCaseBug) { // Temporarily remove camelCase/camel-case params #1035 def unexpectedParamsLowerCase = unexpectedParams.collect{ it.replace("-", "").toLowerCase()} if (!unexpectedParamsLowerCase.contains(specifiedParamLowerCase)){ @@ -125,36 +137,36 @@ class NfcoreSchema { //=====================================================================// // Validate parameters against the schema - InputStream inputStream = new File(jsonSchema).newInputStream() - JSONObject rawSchema = new JSONObject(new JSONTokener(inputStream)) + InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() + JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) // Remove anything that's in params.schema_ignore_params - rawSchema = removeIgnoredParams(rawSchema, params) + raw_schema = removeIgnoredParams(raw_schema, params) - Schema schema = SchemaLoader.load(rawSchema) + Schema schema = SchemaLoader.load(raw_schema) // Clean the parameters def cleanedParams = cleanParameters(params) // Convert to JSONObject def jsonParams = new JsonBuilder(cleanedParams) - JSONObject paramsJSON = new JSONObject(jsonParams.toString()) + JSONObject params_json = new JSONObject(jsonParams.toString()) // Validate try { - schema.validate(paramsJSON) + schema.validate(params_json) } catch (ValidationException e) { println '' log.error 'ERROR: Validation of pipeline parameters failed!' JSONObject exceptionJSON = e.toJSON() - printExceptions(exceptionJSON, paramsJSON, log) + printExceptions(exceptionJSON, params_json, log, enums) println '' has_error = true } // Check for unexpected parameters if (unexpectedParams.size() > 0) { - Map colors = log_colours(params.monochrome_logs) + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) println '' def warn_msg = 'Found unexpected parameters:' for (unexpectedParam in unexpectedParams) { @@ -170,266 +182,17 @@ class NfcoreSchema { } } - // Loop over nested exceptions and print the causingException - private static void printExceptions(exJSON, paramsJSON, log) { - def causingExceptions = exJSON['causingExceptions'] - if (causingExceptions.length() == 0) { - def m = exJSON['message'] =~ /required key \[([^\]]+)\] not found/ - // Missing required param - if (m.matches()) { - log.error "* Missing required parameter: --${m[0][1]}" - } - // Other base-level error - else if (exJSON['pointerToViolation'] == '#') { - log.error "* ${exJSON['message']}" - } - // Error with specific param - else { - def param = exJSON['pointerToViolation'] - ~/^#\// - def param_val = paramsJSON[param].toString() - log.error "* --${param}: ${exJSON['message']} (${param_val})" - } - } - for (ex in causingExceptions) { - printExceptions(ex, paramsJSON, log) - } - } - - // Remove an element from a JSONArray - private static JSONArray removeElement(jsonArray, element){ - def list = [] - int len = jsonArray.length() - for (int i=0;i - if(rawSchema.keySet().contains('definitions')){ - rawSchema.definitions.each { definition -> - for (key in definition.keySet()){ - if (definition[key].get("properties").keySet().contains(ignore_param)){ - // Remove the param to ignore - definition[key].get("properties").remove(ignore_param) - // If the param was required, change this - if (definition[key].has("required")) { - def cleaned_required = removeElement(definition[key].required, ignore_param) - definition[key].put("required", cleaned_required) - } - } - } - } - } - if(rawSchema.keySet().contains('properties') && rawSchema.get('properties').keySet().contains(ignore_param)) { - rawSchema.get("properties").remove(ignore_param) - } - if(rawSchema.keySet().contains('required') && rawSchema.required.contains(ignore_param)) { - def cleaned_required = removeElement(rawSchema.required, ignore_param) - rawSchema.put("required", cleaned_required) - } - } - return rawSchema - } - - private static Map cleanParameters(params) { - def new_params = params.getClass().newInstance(params) - for (p in params) { - // remove anything evaluating to false - if (!p['value']) { - new_params.remove(p.key) - } - // Cast MemoryUnit to String - if (p['value'].getClass() == nextflow.util.MemoryUnit) { - new_params.replace(p.key, p['value'].toString()) - } - // Cast Duration to String - if (p['value'].getClass() == nextflow.util.Duration) { - new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) - } - // Cast LinkedHashMap to String - if (p['value'].getClass() == LinkedHashMap) { - new_params.replace(p.key, p['value'].toString()) - } - } - return new_params - } - - /* - * This method tries to read a JSON params file - */ - private static LinkedHashMap params_load(String json_schema) { - def params_map = new LinkedHashMap() - try { - params_map = params_read(json_schema) - } catch (Exception e) { - println "Could not read parameters settings from JSON. $e" - params_map = new LinkedHashMap() - } - return params_map - } - - private static Map log_colours(Boolean monochrome_logs) { - Map colorcodes = [:] - - // Reset / Meta - colorcodes['reset'] = monochrome_logs ? '' : "\033[0m" - colorcodes['bold'] = monochrome_logs ? '' : "\033[1m" - colorcodes['dim'] = monochrome_logs ? '' : "\033[2m" - colorcodes['underlined'] = monochrome_logs ? '' : "\033[4m" - colorcodes['blink'] = monochrome_logs ? '' : "\033[5m" - colorcodes['reverse'] = monochrome_logs ? '' : "\033[7m" - colorcodes['hidden'] = monochrome_logs ? '' : "\033[8m" - - // Regular Colors - colorcodes['black'] = monochrome_logs ? '' : "\033[0;30m" - colorcodes['red'] = monochrome_logs ? '' : "\033[0;31m" - colorcodes['green'] = monochrome_logs ? '' : "\033[0;32m" - colorcodes['yellow'] = monochrome_logs ? '' : "\033[0;33m" - colorcodes['blue'] = monochrome_logs ? '' : "\033[0;34m" - colorcodes['purple'] = monochrome_logs ? '' : "\033[0;35m" - colorcodes['cyan'] = monochrome_logs ? '' : "\033[0;36m" - colorcodes['white'] = monochrome_logs ? '' : "\033[0;37m" - - // Bold - colorcodes['bblack'] = monochrome_logs ? '' : "\033[1;30m" - colorcodes['bred'] = monochrome_logs ? '' : "\033[1;31m" - colorcodes['bgreen'] = monochrome_logs ? '' : "\033[1;32m" - colorcodes['byellow'] = monochrome_logs ? '' : "\033[1;33m" - colorcodes['bblue'] = monochrome_logs ? '' : "\033[1;34m" - colorcodes['bpurple'] = monochrome_logs ? '' : "\033[1;35m" - colorcodes['bcyan'] = monochrome_logs ? '' : "\033[1;36m" - colorcodes['bwhite'] = monochrome_logs ? '' : "\033[1;37m" - - // Underline - colorcodes['ublack'] = monochrome_logs ? '' : "\033[4;30m" - colorcodes['ured'] = monochrome_logs ? '' : "\033[4;31m" - colorcodes['ugreen'] = monochrome_logs ? '' : "\033[4;32m" - colorcodes['uyellow'] = monochrome_logs ? '' : "\033[4;33m" - colorcodes['ublue'] = monochrome_logs ? '' : "\033[4;34m" - colorcodes['upurple'] = monochrome_logs ? '' : "\033[4;35m" - colorcodes['ucyan'] = monochrome_logs ? '' : "\033[4;36m" - colorcodes['uwhite'] = monochrome_logs ? '' : "\033[4;37m" - - // High Intensity - colorcodes['iblack'] = monochrome_logs ? '' : "\033[0;90m" - colorcodes['ired'] = monochrome_logs ? '' : "\033[0;91m" - colorcodes['igreen'] = monochrome_logs ? '' : "\033[0;92m" - colorcodes['iyellow'] = monochrome_logs ? '' : "\033[0;93m" - colorcodes['iblue'] = monochrome_logs ? '' : "\033[0;94m" - colorcodes['ipurple'] = monochrome_logs ? '' : "\033[0;95m" - colorcodes['icyan'] = monochrome_logs ? '' : "\033[0;96m" - colorcodes['iwhite'] = monochrome_logs ? '' : "\033[0;97m" - - // Bold High Intensity - colorcodes['biblack'] = monochrome_logs ? '' : "\033[1;90m" - colorcodes['bired'] = monochrome_logs ? '' : "\033[1;91m" - colorcodes['bigreen'] = monochrome_logs ? '' : "\033[1;92m" - colorcodes['biyellow'] = monochrome_logs ? '' : "\033[1;93m" - colorcodes['biblue'] = monochrome_logs ? '' : "\033[1;94m" - colorcodes['bipurple'] = monochrome_logs ? '' : "\033[1;95m" - colorcodes['bicyan'] = monochrome_logs ? '' : "\033[1;96m" - colorcodes['biwhite'] = monochrome_logs ? '' : "\033[1;97m" - - return colorcodes - } - - static String dashed_line(monochrome_logs) { - Map colors = log_colours(monochrome_logs) - return "-${colors.dim}----------------------------------------------------${colors.reset}-" - } - - /* - Method to actually read in JSON file using Groovy. - Group (as Key), values are all parameters - - Parameter1 as Key, Description as Value - - Parameter2 as Key, Description as Value - .... - Group - - - */ - private static LinkedHashMap params_read(String json_schema) throws Exception { - def json = new File(json_schema).text - def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') - def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') - /* Tree looks like this in nf-core schema - * definitions <- this is what the first get('definitions') gets us - group 1 - title - description - properties - parameter 1 - type - description - parameter 2 - type - description - group 2 - title - description - properties - parameter 1 - type - description - * properties <- parameters can also be ungrouped, outside of definitions - parameter 1 - type - description - */ - - // Grouped params - def params_map = new LinkedHashMap() - schema_definitions.each { key, val -> - def Map group = schema_definitions."$key".properties // Gets the property object of the group - def title = schema_definitions."$key".title - def sub_params = new LinkedHashMap() - group.each { innerkey, value -> - sub_params.put(innerkey, value) - } - params_map.put(title, sub_params) - } - - // Ungrouped params - def ungrouped_params = new LinkedHashMap() - schema_properties.each { innerkey, value -> - ungrouped_params.put(innerkey, value) - } - params_map.put("Other parameters", ungrouped_params) - - return params_map - } - - /* - * Get maximum number of characters across all parameter names - */ - private static Integer params_max_chars(params_map) { - Integer max_chars = 0 - for (group in params_map.keySet()) { - def group_params = params_map.get(group) // This gets the parameters of that particular group - for (param in group_params.keySet()) { - if (param.size() > max_chars) { - max_chars = param.size() - } - } - } - return max_chars - } - - /* - * Beautify parameters for --help - */ - private static String params_help(workflow, params, json_schema, command) { - Map colors = log_colours(params.monochrome_logs) + // + // Beautify parameters for --help + // + public static String paramsHelp(workflow, params, command, schema_filename='nextflow_schema.json') { + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) Integer num_hidden = 0 String output = '' output += 'Typical pipeline command:\n\n' output += " ${colors.cyan}${command}${colors.reset}\n\n" - Map params_map = params_load(json_schema) - Integer max_chars = params_max_chars(params_map) + 1 + Map params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) + Integer max_chars = paramsMaxChars(params_map) + 1 Integer desc_indent = max_chars + 14 Integer dec_linewidth = 160 - desc_indent for (group in params_map.keySet()) { @@ -443,7 +206,7 @@ class NfcoreSchema { } def type = '[' + group_params.get(param).type + ']' def description = group_params.get(param).description - def defaultValue = group_params.get(param).default ? " [default: " + group_params.get(param).default.toString() + "]" : '' + def defaultValue = group_params.get(param).default != null ? " [default: " + group_params.get(param).default.toString() + "]" : '' def description_default = description + colors.dim + defaultValue + colors.reset // Wrap long description texts // Loosely based on https://dzone.com/articles/groovy-plain-text-word-wrap @@ -469,18 +232,17 @@ class NfcoreSchema { output += group_output } } - output += dashed_line(params.monochrome_logs) if (num_hidden > 0){ - output += colors.dim + "\n Hiding $num_hidden params, use --show_hidden_params to show.\n" + colors.reset - output += dashed_line(params.monochrome_logs) + output += colors.dim + "!! Hiding $num_hidden params, use --show_hidden_params to show them !!\n" + colors.reset } + output += NfcoreTemplate.dashedLine(params.monochrome_logs) return output } - /* - * Groovy Map summarising parameters/workflow options used by the pipeline - */ - private static LinkedHashMap params_summary_map(workflow, params, json_schema) { + // + // Groovy Map summarising parameters/workflow options used by the pipeline + // + public static LinkedHashMap paramsSummaryMap(workflow, params, schema_filename='nextflow_schema.json') { // Get a selection of core Nextflow workflow options def Map workflow_summary = [:] if (workflow.revision) { @@ -502,13 +264,12 @@ class NfcoreSchema { // Get pipeline parameters defined in JSON Schema def Map params_summary = [:] - def blacklist = ['hostnames'] - def params_map = params_load(json_schema) + def params_map = paramsLoad(getSchemaPath(workflow, schema_filename=schema_filename)) for (group in params_map.keySet()) { def sub_params = new LinkedHashMap() def group_params = params_map.get(group) // This gets the parameters of that particular group for (param in group_params.keySet()) { - if (params.containsKey(param) && !blacklist.contains(param)) { + if (params.containsKey(param)) { def params_value = params.get(param) def schema_value = group_params.get(param).default def param_type = group_params.get(param).type @@ -546,14 +307,14 @@ class NfcoreSchema { return [ 'Core Nextflow options' : workflow_summary ] << params_summary } - /* - * Beautify parameters for summary and return as string - */ - private static String params_summary_log(workflow, params, json_schema) { - Map colors = log_colours(params.monochrome_logs) + // + // Beautify parameters for summary and return as string + // + public static String paramsSummaryLog(workflow, params) { + Map colors = NfcoreTemplate.logColours(params.monochrome_logs) String output = '' - def params_map = params_summary_map(workflow, params, json_schema) - def max_chars = params_max_chars(params_map) + def params_map = paramsSummaryMap(workflow, params) + def max_chars = paramsMaxChars(params_map) for (group in params_map.keySet()) { def group_params = params_map.get(group) // This gets the parameters of that particular group if (group_params) { @@ -564,10 +325,205 @@ class NfcoreSchema { output += '\n' } } - output += dashed_line(params.monochrome_logs) - output += colors.dim + "\n Only displaying parameters that differ from defaults.\n" + colors.reset - output += dashed_line(params.monochrome_logs) + output += "!! Only displaying parameters that differ from the pipeline defaults !!\n" + output += NfcoreTemplate.dashedLine(params.monochrome_logs) return output } + // + // Loop over nested exceptions and print the causingException + // + private static void printExceptions(ex_json, params_json, log, enums, limit=5) { + def causingExceptions = ex_json['causingExceptions'] + if (causingExceptions.length() == 0) { + def m = ex_json['message'] =~ /required key \[([^\]]+)\] not found/ + // Missing required param + if (m.matches()) { + log.error "* Missing required parameter: --${m[0][1]}" + } + // Other base-level error + else if (ex_json['pointerToViolation'] == '#') { + log.error "* ${ex_json['message']}" + } + // Error with specific param + else { + def param = ex_json['pointerToViolation'] - ~/^#\// + def param_val = params_json[param].toString() + if (enums.containsKey(param)) { + def error_msg = "* --${param}: '${param_val}' is not a valid choice (Available choices" + if (enums[param].size() > limit) { + log.error "${error_msg} (${limit} of ${enums[param].size()}): ${enums[param][0..limit-1].join(', ')}, ... )" + } else { + log.error "${error_msg}: ${enums[param].join(', ')})" + } + } else { + log.error "* --${param}: ${ex_json['message']} (${param_val})" + } + } + } + for (ex in causingExceptions) { + printExceptions(ex, params_json, log, enums) + } + } + + // + // Remove an element from a JSONArray + // + private static JSONArray removeElement(json_array, element) { + def list = [] + int len = json_array.length() + for (int i=0;i + if(raw_schema.keySet().contains('definitions')){ + raw_schema.definitions.each { definition -> + for (key in definition.keySet()){ + if (definition[key].get("properties").keySet().contains(ignore_param)){ + // Remove the param to ignore + definition[key].get("properties").remove(ignore_param) + // If the param was required, change this + if (definition[key].has("required")) { + def cleaned_required = removeElement(definition[key].required, ignore_param) + definition[key].put("required", cleaned_required) + } + } + } + } + } + if(raw_schema.keySet().contains('properties') && raw_schema.get('properties').keySet().contains(ignore_param)) { + raw_schema.get("properties").remove(ignore_param) + } + if(raw_schema.keySet().contains('required') && raw_schema.required.contains(ignore_param)) { + def cleaned_required = removeElement(raw_schema.required, ignore_param) + raw_schema.put("required", cleaned_required) + } + } + return raw_schema + } + + // + // Clean and check parameters relative to Nextflow native classes + // + private static Map cleanParameters(params) { + def new_params = params.getClass().newInstance(params) + for (p in params) { + // remove anything evaluating to false + if (!p['value']) { + new_params.remove(p.key) + } + // Cast MemoryUnit to String + if (p['value'].getClass() == nextflow.util.MemoryUnit) { + new_params.replace(p.key, p['value'].toString()) + } + // Cast Duration to String + if (p['value'].getClass() == nextflow.util.Duration) { + new_params.replace(p.key, p['value'].toString().replaceFirst(/d(?!\S)/, "day")) + } + // Cast LinkedHashMap to String + if (p['value'].getClass() == LinkedHashMap) { + new_params.replace(p.key, p['value'].toString()) + } + } + return new_params + } + + // + // This function tries to read a JSON params file + // + private static LinkedHashMap paramsLoad(String json_schema) { + def params_map = new LinkedHashMap() + try { + params_map = paramsRead(json_schema) + } catch (Exception e) { + println "Could not read parameters settings from JSON. $e" + params_map = new LinkedHashMap() + } + return params_map + } + + // + // Method to actually read in JSON file using Groovy. + // Group (as Key), values are all parameters + // - Parameter1 as Key, Description as Value + // - Parameter2 as Key, Description as Value + // .... + // Group + // - + private static LinkedHashMap paramsRead(String json_schema) throws Exception { + def json = new File(json_schema).text + def Map schema_definitions = (Map) new JsonSlurper().parseText(json).get('definitions') + def Map schema_properties = (Map) new JsonSlurper().parseText(json).get('properties') + /* Tree looks like this in nf-core schema + * definitions <- this is what the first get('definitions') gets us + group 1 + title + description + properties + parameter 1 + type + description + parameter 2 + type + description + group 2 + title + description + properties + parameter 1 + type + description + * properties <- parameters can also be ungrouped, outside of definitions + parameter 1 + type + description + */ + + // Grouped params + def params_map = new LinkedHashMap() + schema_definitions.each { key, val -> + def Map group = schema_definitions."$key".properties // Gets the property object of the group + def title = schema_definitions."$key".title + def sub_params = new LinkedHashMap() + group.each { innerkey, value -> + sub_params.put(innerkey, value) + } + params_map.put(title, sub_params) + } + + // Ungrouped params + def ungrouped_params = new LinkedHashMap() + schema_properties.each { innerkey, value -> + ungrouped_params.put(innerkey, value) + } + params_map.put("Other parameters", ungrouped_params) + + return params_map + } + + // + // Get maximum number of characters across all parameter names + // + private static Integer paramsMaxChars(params_map) { + Integer max_chars = 0 + for (group in params_map.keySet()) { + def group_params = params_map.get(group) // This gets the parameters of that particular group + for (param in group_params.keySet()) { + if (param.size() > max_chars) { + max_chars = param.size() + } + } + } + return max_chars + } } diff --git a/modules.json b/modules.json index a623d7f1..d3292b1c 100644 --- a/modules.json +++ b/modules.json @@ -4,38 +4,38 @@ "repos": { "nf-core/modules": { "custom/dumpsoftwareversions": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "fastqc": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "49b18b1639f4f7104187058866a8fab33332bdfe" }, "nanolyse": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "pycoqc": { - "git_sha": "49da8642876ae4d91128168cd0db4f1c858d7792" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "samtools/flagstat": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/idxstats": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/index": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/sort": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "samtools/stats": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, "stringtie/merge": { - "git_sha": "3aacd46da2b221ed47aaa05c413a828538d2c2ae" + "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, "untar": { - "git_sha": "20d8250d9f39ddb05dfb437603aaf99b5c0b2b41" + "git_sha": "9ae34a01d1747019fd37753ff4cafb05aec35a2b" } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf index 934bb467..327d5100 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/main.nf @@ -15,6 +15,9 @@ process CUSTOM_DUMPSOFTWAREVERSIONS { path "software_versions_mqc.yml", emit: mqc_yml path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' template 'dumpsoftwareversions.py' diff --git a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml index 5b5b8a60..60b546a0 100644 --- a/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml +++ b/modules/nf-core/modules/custom/dumpsoftwareversions/meta.yml @@ -8,7 +8,7 @@ tools: description: Custom module used to dump software versions within the nf-core pipeline template homepage: https://github.com/nf-core/tools documentation: https://github.com/nf-core/tools - licence: ['MIT'] + licence: ["MIT"] input: - versions: type: file diff --git a/modules/nf-core/modules/fastqc/main.nf b/modules/nf-core/modules/fastqc/main.nf index d250eca0..05730368 100644 --- a/modules/nf-core/modules/fastqc/main.nf +++ b/modules/nf-core/modules/fastqc/main.nf @@ -15,6 +15,9 @@ process FASTQC { tuple val(meta), path("*.zip") , emit: zip path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' // Add soft-links to original FastQs for consistent naming in pipeline @@ -41,4 +44,16 @@ process FASTQC { END_VERSIONS """ } + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.html + touch ${prefix}.zip + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + fastqc: \$( fastqc --version | sed -e "s/FastQC v//g" ) + END_VERSIONS + """ } diff --git a/modules/nf-core/modules/fastqc/meta.yml b/modules/nf-core/modules/fastqc/meta.yml index b09553a3..4da5bb5a 100644 --- a/modules/nf-core/modules/fastqc/meta.yml +++ b/modules/nf-core/modules/fastqc/meta.yml @@ -1,52 +1,52 @@ name: fastqc description: Run FastQC on sequenced reads keywords: - - quality control - - qc - - adapters - - fastq + - quality control + - qc + - adapters + - fastq tools: - - fastqc: - description: | - FastQC gives general quality metrics about your reads. - It provides information about the quality score distribution - across your reads, the per base sequence content (%A/C/G/T). - You get information about adapter contamination and other - overrepresented sequences. - homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ - documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ - licence: ['GPL-2.0-only'] + - fastqc: + description: | + FastQC gives general quality metrics about your reads. + It provides information about the quality score distribution + across your reads, the per base sequence content (%A/C/G/T). + You get information about adapter contamination and other + overrepresented sequences. + homepage: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/ + documentation: https://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/ + licence: ["GPL-2.0-only"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - reads: - type: file - description: | - List of input FastQ files of size 1 and 2 for single-end and paired-end data, - respectively. + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - reads: + type: file + description: | + List of input FastQ files of size 1 and 2 for single-end and paired-end data, + respectively. output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - html: - type: file - description: FastQC report - pattern: "*_{fastqc.html}" - - zip: - type: file - description: FastQC report archive - pattern: "*_{fastqc.zip}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - html: + type: file + description: FastQC report + pattern: "*_{fastqc.html}" + - zip: + type: file + description: FastQC report archive + pattern: "*_{fastqc.zip}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@grst" - - "@ewels" - - "@FelixKrueger" + - "@drpatelh" + - "@grst" + - "@ewels" + - "@FelixKrueger" diff --git a/modules/nf-core/modules/nanolyse/main.nf b/modules/nf-core/modules/nanolyse/main.nf index c52d9e9d..2b4f0928 100644 --- a/modules/nf-core/modules/nanolyse/main.nf +++ b/modules/nf-core/modules/nanolyse/main.nf @@ -16,16 +16,19 @@ process NANOLYSE { path "*.log" , emit: log path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" """ gunzip -c $fastq | NanoLyse -r $fasta | gzip > ${prefix}.fastq.gz mv NanoLyse.log ${prefix}.nanolyse.log + cat <<-END_VERSIONS > versions.yml "${task.process}": nanolyse: \$(NanoLyse --version 2>&1 | sed -e "s/NanoLyse //g") END_VERSIONS """ } - diff --git a/modules/nf-core/modules/nanolyse/meta.yml b/modules/nf-core/modules/nanolyse/meta.yml index 326fc221..c5562a04 100644 --- a/modules/nf-core/modules/nanolyse/meta.yml +++ b/modules/nf-core/modules/nanolyse/meta.yml @@ -1,47 +1,47 @@ name: nanolyse description: DNA contaminant removal using NanoLyse keywords: - - contaminant_removal + - contaminant_removal tools: - - nanolyse: - description: | - DNA contaminant removal using NanoLyse - homepage: https://github.com/wdecoster/nanolyse - documentation: https://github.com/wdecoster/nanolyse#nanolyse - licence: ['GPL-3.0-or-later'] + - nanolyse: + description: | + DNA contaminant removal using NanoLyse + homepage: https://github.com/wdecoster/nanolyse + documentation: https://github.com/wdecoster/nanolyse#nanolyse + licence: ["GPL-3.0-or-later"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fastq: - type: file - description: | - Basecalled reads in FASTQ.GZ format - pattern: "*.fastq.gz" - - fasta: - type: file - description: | - A reference fasta file against which to filter. - pattern: "*.fasta" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fastq: + type: file + description: | + Basecalled reads in FASTQ.GZ format + pattern: "*.fastq.gz" + - fasta: + type: file + description: | + A reference fasta file against which to filter. + pattern: "*.fasta" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fastq: - type: file - description: Reads with contaminants removed in FASTQ format - pattern: "*.fastq.gz" - - log: - type: file - description: Log of the Nanolyse run. - pattern: "*.log" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fastq: + type: file + description: Reads with contaminants removed in FASTQ format + pattern: "*.fastq.gz" + - log: + type: file + description: Log of the Nanolyse run. + pattern: "*.log" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@yuukiiwa" + - "@yuukiiwa" diff --git a/modules/nf-core/modules/pycoqc/main.nf b/modules/nf-core/modules/pycoqc/main.nf index ab18a3fc..a5e6fcb2 100644 --- a/modules/nf-core/modules/pycoqc/main.nf +++ b/modules/nf-core/modules/pycoqc/main.nf @@ -15,6 +15,9 @@ process PYCOQC { path "*.json" , emit: json path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ @@ -23,10 +26,10 @@ process PYCOQC { -f $summary \\ -o pycoqc.html \\ -j pycoqc.json + cat <<-END_VERSIONS > versions.yml "${task.process}": pycoqc: \$(pycoQC --version 2>&1 | sed 's/^.*pycoQC v//; s/ .*\$//') END_VERSIONS """ } - diff --git a/modules/nf-core/modules/pycoqc/meta.yml b/modules/nf-core/modules/pycoqc/meta.yml index 33bd6b07..83748855 100644 --- a/modules/nf-core/modules/pycoqc/meta.yml +++ b/modules/nf-core/modules/pycoqc/meta.yml @@ -12,7 +12,7 @@ tools: documentation: https://tleonardi.github.io/pycoQC/ tool_dev_url: https://github.com/tleonardi/pycoQC doi: "10.21105/joss.01236" - licence: ['GNU General Public v3 (GPL v3)'] + licence: ["GNU General Public v3 (GPL v3)"] input: - meta: diff --git a/modules/nf-core/modules/samtools/flagstat/main.nf b/modules/nf-core/modules/samtools/flagstat/main.nf index 2b62e31e..b87b2108 100644 --- a/modules/nf-core/modules/samtools/flagstat/main.nf +++ b/modules/nf-core/modules/samtools/flagstat/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FLAGSTAT { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam), path(bai) @@ -14,14 +14,21 @@ process SAMTOOLS_FLAGSTAT { tuple val(meta), path("*.flagstat"), emit: flagstat path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ - samtools flagstat --threads ${task.cpus-1} $bam > ${bam}.flagstat + samtools \\ + flagstat \\ + --threads ${task.cpus-1} \\ + $bam \\ + > ${bam}.flagstat + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } - diff --git a/modules/nf-core/modules/samtools/flagstat/meta.yml b/modules/nf-core/modules/samtools/flagstat/meta.yml index adb182e9..95269063 100644 --- a/modules/nf-core/modules/samtools/flagstat/meta.yml +++ b/modules/nf-core/modules/samtools/flagstat/meta.yml @@ -1,50 +1,49 @@ name: samtools_flagstat description: Counts the number of alignments in a BAM/CRAM/SAM file for each FLAG type keywords: - - stats - - mapping - - counts - - bam - - sam - - cram + - stats + - mapping + - counts + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - flagstat: - type: file - description: File containing samtools flagstat output - pattern: "*.{flagstat}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - flagstat: + type: file + description: File containing samtools flagstat output + pattern: "*.{flagstat}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - + - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/idxstats/main.nf b/modules/nf-core/modules/samtools/idxstats/main.nf index e4c6623e..a49ff35f 100644 --- a/modules/nf-core/modules/samtools/idxstats/main.nf +++ b/modules/nf-core/modules/samtools/idxstats/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_IDXSTATS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam), path(bai) @@ -14,14 +14,20 @@ process SAMTOOLS_IDXSTATS { tuple val(meta), path("*.idxstats"), emit: idxstats path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ - samtools idxstats $bam > ${bam}.idxstats + samtools \\ + idxstats \\ + $bam \\ + > ${bam}.idxstats + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } - diff --git a/modules/nf-core/modules/samtools/idxstats/meta.yml b/modules/nf-core/modules/samtools/idxstats/meta.yml index 334a1d51..3710ab88 100644 --- a/modules/nf-core/modules/samtools/idxstats/meta.yml +++ b/modules/nf-core/modules/samtools/idxstats/meta.yml @@ -1,51 +1,50 @@ name: samtools_idxstats description: Reports alignment summary statistics for a BAM/CRAM/SAM file keywords: - - stats - - mapping - - counts - - chromosome - - bam - - sam - - cram + - stats + - mapping + - counts + - chromosome + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - bai: - type: file - description: Index for BAM/CRAM/SAM file - pattern: "*.{bai,crai,sai}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - bai: + type: file + description: Index for BAM/CRAM/SAM file + pattern: "*.{bai,crai,sai}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - idxstats: - type: file - description: File containing samtools idxstats output - pattern: "*.{idxstats}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - idxstats: + type: file + description: File containing samtools idxstats output + pattern: "*.{idxstats}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - + - "@drpatelh" diff --git a/modules/nf-core/modules/samtools/index/main.nf b/modules/nf-core/modules/samtools/index/main.nf index eb79d3d3..e04e63e8 100644 --- a/modules/nf-core/modules/samtools/index/main.nf +++ b/modules/nf-core/modules/samtools/index/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_INDEX { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(input) @@ -16,14 +16,33 @@ process SAMTOOLS_INDEX { tuple val(meta), path("*.crai"), optional:true, emit: crai path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ - samtools index -@ ${task.cpus-1} $args $input + samtools \\ + index \\ + -@ ${task.cpus-1} \\ + $args \\ + $input + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ -} + stub: + """ + touch ${input}.bai + touch ${input}.crai + touch ${input}.csi + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/samtools/index/meta.yml b/modules/nf-core/modules/samtools/index/meta.yml index c4d2da1c..e5cadbc2 100644 --- a/modules/nf-core/modules/samtools/index/meta.yml +++ b/modules/nf-core/modules/samtools/index/meta.yml @@ -1,54 +1,53 @@ name: samtools_index description: Index SAM/BAM/CRAM file keywords: - - index - - bam - - sam - - cram + - index + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - crai: - type: file - description: BAM/CRAM/SAM index file - pattern: "*.{bai,crai,sai}" - - csi: - type: file - description: CSI index file - pattern: "*.{csi}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - crai: + type: file + description: BAM/CRAM/SAM index file + pattern: "*.{bai,crai,sai}" + - csi: + type: file + description: CSI index file + pattern: "*.{csi}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" - - "@maxulysse" - + - "@drpatelh" + - "@ewels" + - "@maxulysse" diff --git a/modules/nf-core/modules/samtools/sort/main.nf b/modules/nf-core/modules/samtools/sort/main.nf index ad981e0c..b4fc1cbe 100644 --- a/modules/nf-core/modules/samtools/sort/main.nf +++ b/modules/nf-core/modules/samtools/sort/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_SORT { tag "$meta.id" label 'process_medium' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam) @@ -14,15 +14,29 @@ process SAMTOOLS_SORT { tuple val(meta), path("*.bam"), emit: bam path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' def prefix = task.ext.prefix ?: "${meta.id}" + if ("$bam" == "${prefix}.bam") error "Input and output names are the same, use \"task.ext.prefix\" to disambiguate!" """ - samtools sort $args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam + samtools sort $args -@ $task.cpus -o ${prefix}.bam -T $prefix $bam cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ -} + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bam + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/samtools/sort/meta.yml b/modules/nf-core/modules/samtools/sort/meta.yml index 78431457..a820c55a 100644 --- a/modules/nf-core/modules/samtools/sort/meta.yml +++ b/modules/nf-core/modules/samtools/sort/meta.yml @@ -1,45 +1,44 @@ name: samtools_sort description: Sort SAM/BAM/CRAM file keywords: - - sort - - bam - - sam - - cram + - sort + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - bam: - type: file - description: Sorted BAM/CRAM/SAM file - pattern: "*.{bam,cram,sam}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - bam: + type: file + description: Sorted BAM/CRAM/SAM file + pattern: "*.{bam,cram,sam}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@ewels" - + - "@drpatelh" + - "@ewels" diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 596197c0..bbdc3240 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -2,28 +2,47 @@ process SAMTOOLS_STATS { tag "$meta.id" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(input), path(input_index) - //path fasta + path fasta output: tuple val(meta), path("*.stats"), emit: stats path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' - //def reference = fasta ? "--reference ${fasta}" : "" + def reference = fasta ? "--reference ${fasta}" : "" """ - samtools stats --threads ${task.cpus-1} ${input} > ${input}.stats + samtools \\ + stats \\ + --threads ${task.cpus-1} \\ + ${reference} \\ + ${input} \\ + > ${input}.stats + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ -} + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${input}.stats + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/samtools/stats/meta.yml b/modules/nf-core/modules/samtools/stats/meta.yml index de9ab166..cac50b1c 100644 --- a/modules/nf-core/modules/samtools/stats/meta.yml +++ b/modules/nf-core/modules/samtools/stats/meta.yml @@ -1,54 +1,53 @@ name: samtools_stats description: Produces comprehensive statistics from SAM/BAM/CRAM file keywords: - - statistics - - counts - - bam - - sam - - cram + - statistics + - counts + - bam + - sam + - cram tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: hhttp://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ['MIT'] + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: hhttp://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - input: + type: file + description: BAM/CRAM file from alignment + pattern: "*.{bam,cram}" + - input_index: + type: file + description: BAI/CRAI file from alignment + pattern: "*.{bai,crai}" + - fasta: + type: optional file + description: Reference file the CRAM was created with + pattern: "*.{fasta,fa}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - stats: type: file - description: BAM/CRAM file from alignment - pattern: "*.{bam,cram}" - - input_index: + description: File containing samtools stats output + pattern: "*.{stats}" + - versions: type: file - description: BAI/CRAI file from alignment - pattern: "*.{bai,crai}" - - fasta: - type: optional file - description: Reference file the CRAM was created with - pattern: "*.{fasta,fa}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - stats: - type: file - description: File containing samtools stats output - pattern: "*.{stats}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + description: File containing software versions + pattern: "versions.yml" authors: - - "@drpatelh" - - "@FriederikeHanssen" - + - "@drpatelh" + - "@FriederikeHanssen" diff --git a/modules/nf-core/modules/stringtie/merge/main.nf b/modules/nf-core/modules/stringtie/merge/main.nf index 82e5ea58..aa11eb36 100644 --- a/modules/nf-core/modules/stringtie/merge/main.nf +++ b/modules/nf-core/modules/stringtie/merge/main.nf @@ -15,6 +15,9 @@ process STRINGTIE_MERGE { path "stringtie.merged.gtf", emit: gtf path "versions.yml" , emit: versions + when: + task.ext.when == null || task.ext.when + script: def args = task.ext.args ?: '' """ @@ -22,10 +25,10 @@ process STRINGTIE_MERGE { --merge $stringtie_gtf \\ -G $annotation_gtf \\ -o stringtie.merged.gtf + cat <<-END_VERSIONS > versions.yml "${task.process}": stringtie: \$(stringtie --version 2>&1) END_VERSIONS """ } - diff --git a/modules/nf-core/modules/stringtie/merge/meta.yml b/modules/nf-core/modules/stringtie/merge/meta.yml index 02899766..df66696f 100644 --- a/modules/nf-core/modules/stringtie/merge/meta.yml +++ b/modules/nf-core/modules/stringtie/merge/meta.yml @@ -1,37 +1,37 @@ name: stringtie_merge description: Merges the annotation gtf file and the stringtie output gtf files keywords: - - merge - - gtf - - reference + - merge + - gtf + - reference tools: - - stringtie2: - description: | - Transcript assembly and quantification for RNA-Seq - homepage: https://ccb.jhu.edu/software/stringtie/index.shtml - documentation: https://ccb.jhu.edu/software/stringtie/index.shtml?t=manual - licence: ['MIT'] + - stringtie2: + description: | + Transcript assembly and quantification for RNA-Seq + homepage: https://ccb.jhu.edu/software/stringtie/index.shtml + documentation: https://ccb.jhu.edu/software/stringtie/index.shtml?t=manual + licence: ["MIT"] input: - - stringtie_gtf: - type: file - description: | - Stringtie transcript gtf output(s). - pattern: "*.gtf" - - annotation_gtf: - type: file - description: | - Annotation gtf file. - pattern: "*.gtf" + - stringtie_gtf: + type: file + description: | + Stringtie transcript gtf output(s). + pattern: "*.gtf" + - annotation_gtf: + type: file + description: | + Annotation gtf file. + pattern: "*.gtf" output: - - merged_gtf: - type: map - description: | - Merged gtf from annotation and stringtie output gtfs. - pattern: "*.gtf" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - merged_gtf: + type: map + description: | + Merged gtf from annotation and stringtie output gtfs. + pattern: "*.gtf" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@yuukiiwa" + - "@yuukiiwa" diff --git a/modules/nf-core/modules/untar/main.nf b/modules/nf-core/modules/untar/main.nf index 4d2c3a31..bbfa0bfe 100644 --- a/modules/nf-core/modules/untar/main.nf +++ b/modules/nf-core/modules/untar/main.nf @@ -1,24 +1,43 @@ process UNTAR { + tag "$archive" label 'process_low' - conda (params.enable_conda ? "conda-forge::sed=4.7" : null) + conda (params.enable_conda ? "conda-forge::tar=1.34" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : - 'biocontainers/biocontainers:v1.2.0_cv1' }" + 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv2/biocontainers_v1.2.0_cv2.img' : + 'biocontainers/biocontainers:v1.2.0_cv2' }" input: - path archive + tuple val(meta), path(archive) output: - path "$untar" , emit: untar - path "versions.yml", emit: versions + tuple val(meta), path("$untar"), emit: untar + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when script: - def args = task.ext.args ?: '' + def args = task.ext.args ?: '' def args2 = task.ext.args2 ?: '' - untar = archive.toString() - '.tar.gz' + untar = archive.toString() - '.tar.gz' + """ + tar \\ + -xzvf \\ + $args \\ + $archive \\ + $args2 \\ + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + untar: \$(echo \$(tar --version 2>&1) | sed 's/^.*(GNU tar) //; s/ Copyright.*\$//') + END_VERSIONS + """ + + stub: + untar = archive.toString() - '.tar.gz' """ - tar -xzvf $args $archive $args2 + touch $untar cat <<-END_VERSIONS > versions.yml "${task.process}": diff --git a/modules/nf-core/modules/untar/meta.yml b/modules/nf-core/modules/untar/meta.yml index 51f94995..d426919b 100644 --- a/modules/nf-core/modules/untar/meta.yml +++ b/modules/nf-core/modules/untar/meta.yml @@ -1,28 +1,38 @@ name: untar description: Extract files. keywords: - - untar - - uncompress + - untar + - uncompress tools: - - untar: - description: | - Extract tar.gz files. - documentation: https://www.gnu.org/software/tar/manual/ - licence: ['GPL-3.0-or-later'] + - untar: + description: | + Extract tar.gz files. + documentation: https://www.gnu.org/software/tar/manual/ + licence: ["GPL-3.0-or-later"] input: - - archive: - type: file - description: File to be untar - pattern: "*.{tar}.{gz}" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - archive: + type: file + description: File to be untar + pattern: "*.{tar}.{gz}" output: - - untar: - type: file - description: - pattern: "*.*" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - untar: + type: file + description: + pattern: "*.*" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" authors: - - "@joseespinosa" - - "@drpatelh" + - "@joseespinosa" + - "@drpatelh" diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf index 5d1c5078..11190963 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -11,7 +11,7 @@ workflow BAM_STATS_SAMTOOLS { ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] main: - SAMTOOLS_STATS ( ch_bam_bai ) + SAMTOOLS_STATS ( ch_bam_bai, null ) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) SAMTOOLS_IDXSTATS ( ch_bam_bai ) From 9057746ff8f1e31a0f96dee85a8a305c3632ab95 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 21 Apr 2022 15:44:05 +0200 Subject: [PATCH 108/169] Fix subworkflow after module change --- subworkflows/nf-core/bam_stats_samtools.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf index 11190963..ec45ee08 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -11,7 +11,7 @@ workflow BAM_STATS_SAMTOOLS { ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] main: - SAMTOOLS_STATS ( ch_bam_bai, null ) + SAMTOOLS_STATS ( ch_bam_bai, false ) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) SAMTOOLS_IDXSTATS ( ch_bam_bai ) From f7ab7dee9019da287f4e54a405501e0f5d900c98 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 21 Apr 2022 15:46:27 +0200 Subject: [PATCH 109/169] Commit before sync --- .github/CONTRIBUTING.md | 15 ++- .github/ISSUE_TEMPLATE/bug_report.yml | 2 - .github/PULL_REQUEST_TEMPLATE.md | 7 +- .github/workflows/branch.yml | 5 +- .github/workflows/linting.yml | 91 +++-------------- .github/workflows/linting_comment.yml | 3 +- .markdownlint.yml | 14 --- assets/email_template.html | 142 ++++++++++++++++++-------- docs/README.md | 8 +- lib/NfcoreSchema.groovy | 4 +- 10 files changed, 133 insertions(+), 158 deletions(-) delete mode 100644 .markdownlint.yml diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index cdbebfc6..a66e3acd 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -15,8 +15,7 @@ Contributions to the code are even more welcome ;) If you'd like to write some code for nf-core/nanoseq, the standard workflow is as follows: -1. Check that there isn't already an issue about your idea in the [nf-core/nanoseq issues](https://github.com/nf-core/nanoseq/issues) to avoid duplicating work - * If there isn't one already, please create one so that others know you're working on this +1. Check that there isn't already an issue about your idea in the [nf-core/nanoseq issues](https://github.com/nf-core/nanoseq/issues) to avoid duplicating work. If there isn't one already, please create one so that others know you're working on this 2. [Fork](https://help.github.com/en/github/getting-started-with-github/fork-a-repo) the [nf-core/nanoseq repository](https://github.com/nf-core/nanoseq) to your GitHub account 3. Make the necessary changes / additions within your forked repository following [Pipeline conventions](#pipeline-contribution-conventions) 4. Use `nf-core schema build` and add any new parameters to the pipeline JSON schema (requires [nf-core tools](https://github.com/nf-core/tools) >= 1.10). @@ -49,9 +48,9 @@ These tests are run both with the latest available version of `Nextflow` and als :warning: Only in the unlikely and regretful event of a release happening with a bug. -* On your own fork, make a new branch `patch` based on `upstream/master`. -* Fix the bug, and bump version (X.Y.Z+1). -* A PR should be made on `master` from patch to directly this particular bug. +- On your own fork, make a new branch `patch` based on `upstream/master`. +- Fix the bug, and bump version (X.Y.Z+1). +- A PR should be made on `master` from patch to directly this particular bug. ## Getting help @@ -73,7 +72,7 @@ If you wish to contribute a new step, please use the following coding standards: 6. Add sanity checks and validation for all relevant parameters. 7. Perform local tests to validate that the new code works as expected. 8. If applicable, add a new test command in `.github/workflow/ci.yml`. -9. Update MultiQC config `assets/multiqc_config.yaml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. +9. Update MultiQC config `assets/multiqc_config.yml` so relevant suffixes, file name clean up and module plots are in the appropriate order. If applicable, add a [MultiQC](https://https://multiqc.info/) module. 10. Add a description of the output files and if relevant any appropriate images from the MultiQC report to `docs/output.md`. ### Default values @@ -92,8 +91,8 @@ The process resources can be passed on to the tool dynamically within the proces Please use the following naming schemes, to make it easy to understand what is going where. -* initial process channel: `ch_output_from_` -* intermediate and terminal channels: `ch__for_` +- initial process channel: `ch_output_from_` +- intermediate and terminal channels: `ch__for_` ### Nextflow version bumping diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 55e0a8a5..dfcd7148 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -1,9 +1,7 @@ - name: Bug report description: Report something that is broken or incorrect labels: bug body: - - type: markdown attributes: value: | diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index 8a21c35e..e7000854 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -10,16 +10,15 @@ Remember that PRs should be made against the dev branch, unless you're preparing Learn more about contributing: [CONTRIBUTING.md](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) --> - ## PR checklist - [ ] This comment contains a description of changes (with reason). - [ ] If you've fixed a bug or added code that should be tested, add tests! - - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) - - [ ] If necessary, also make a PR on the nf-core/nanoseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. + - [ ] If you've added a new tool - have you followed the pipeline conventions in the [contribution docs](https://github.com/nf-core/nanoseq/tree/master/.github/CONTRIBUTING.md) + - [ ] If necessary, also make a PR on the nf-core/nanoseq _branch_ on the [nf-core/test-datasets](https://github.com/nf-core/test-datasets) repository. - [ ] Make sure your code lints (`nf-core lint`). -- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker`). +- [ ] Ensure the test suite passes (`nextflow run . -profile test,docker --outdir `). - [ ] Usage Documentation in `docs/usage.md` is updated. - [ ] Output Documentation in `docs/output.md` is updated. - [ ] `CHANGELOG.md` is updated. diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 859f1daf..5eee8118 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,8 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/nanoseq' run: | - { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/nanoseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] - + "{ [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/nanoseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]]" # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets @@ -43,4 +42,4 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false - +# diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index 3b448773..e9cf5de3 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -1,6 +1,7 @@ name: nf-core linting # This workflow is triggered on pushes and PRs to the repository. -# It runs the `nf-core lint` and markdown lint tests to ensure that the code meets the nf-core guidelines +# It runs the `nf-core lint` and markdown lint tests to ensure +# that the code meets the nf-core guidelines. on: push: pull_request: @@ -8,100 +9,35 @@ on: types: [published] jobs: - Markdown: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' - - name: Install markdownlint - run: npm install -g markdownlint-cli - - name: Run Markdownlint - run: markdownlint . - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## Markdown linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `markdownlint-cli` - * On Mac: `brew install markdownlint-cli` - * Everything else: [Install `npm`](https://www.npmjs.com/get-npm) then [install `markdownlint-cli`](https://www.npmjs.com/package/markdownlint-cli) (`npm install -g markdownlint-cli`) - * Fix the markdown errors - * Automatically: `markdownlint . --fix` - * Manually resolve anything left from `markdownlint .` - - Once you push these changes the test should pass, and you can hide this comment :+1: - - We highly recommend setting up markdownlint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! - - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false - EditorConfig: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 - with: - node-version: '10' + - uses: actions/setup-node@v2 - name: Install editorconfig-checker run: npm install -g editorconfig-checker - name: Run ECLint check - run: editorconfig-checker -exclude README.md $(git ls-files | grep -v test) + run: editorconfig-checker -exclude README.md $(find .* -type f | grep -v '.git\|.py\|.md\|json\|yml\|yaml\|html\|css\|work\|.nextflow\|build\|nf_core.egg-info\|log.txt\|Makefile') - YAML: + Prettier: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v1 - - uses: actions/setup-node@v1 - with: - node-version: '10' - - name: Install yaml-lint - run: npm install -g yaml-lint - - name: Run yaml-lint - run: yamllint $(find ${GITHUB_WORKSPACE} -type f -name "*.yml" -o -name "*.yaml") - - # If the above check failed, post a comment on the PR explaining the failure - - name: Post PR comment - if: failure() - uses: mshick/add-pr-comment@v1 - with: - message: | - ## YAML linting is failing - - To keep the code consistent with lots of contributors, we run automated code consistency checks. - To fix this CI test, please run: - - * Install `yaml-lint` - * [Install `npm`](https://www.npmjs.com/get-npm) then [install `yaml-lint`](https://www.npmjs.com/package/yaml-lint) (`npm install -g yaml-lint`) - * Fix the markdown errors - * Run the test locally: `yamllint $(find . -type f -name "*.yml" -o -name "*.yaml")` - * Fix any reported errors in your YAML files + - uses: actions/checkout@v2 - Once you push these changes the test should pass, and you can hide this comment :+1: + - uses: actions/setup-node@v2 - We highly recommend setting up yaml-lint in your code editor so that this formatting is done automatically on save. Ask about it on Slack for help! + - name: Install Prettier + run: npm install -g prettier - Thanks again for your contribution! - repo-token: ${{ secrets.GITHUB_TOKEN }} - allow-repeats: false + - name: Run Prettier --check + run: prettier --check ${GITHUB_WORKSPACE} nf-core: runs-on: ubuntu-latest steps: - - name: Check out pipeline code uses: actions/checkout@v2 @@ -114,8 +50,8 @@ jobs: - uses: actions/setup-python@v1 with: - python-version: '3.6' - architecture: 'x64' + python-version: "3.6" + architecture: "x64" - name: Install dependencies run: | @@ -143,3 +79,4 @@ jobs: lint_results.md PR_number.txt +# diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 44d72994..91c487a1 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -1,4 +1,3 @@ - name: nf-core linting comment # This workflow is triggered after the linting action is complete # It posts an automated comment to the PR, even if the PR is coming from a fork @@ -27,4 +26,4 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md - +# diff --git a/.markdownlint.yml b/.markdownlint.yml deleted file mode 100644 index 9e605fcf..00000000 --- a/.markdownlint.yml +++ /dev/null @@ -1,14 +0,0 @@ -# Markdownlint configuration file -default: true -line-length: false -ul-indent: - indent: 4 -no-duplicate-header: - siblings_only: true -no-inline-html: - allowed_elements: - - img - - p - - kbd - - details - - summary diff --git a/assets/email_template.html b/assets/email_template.html index 93137811..36ece146 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,53 +1,111 @@ - - - - + + + + - - nf-core/nanoseq Pipeline Report - - -
+ + + nf-core/nanoseq Pipeline Report + + +
+ - +

nf-core/nanoseq v${version}

+

Run Name: $runName

-

nf-core/nanoseq v${version}

-

Run Name: $runName

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

nf-core/nanoseq execution completed unsuccessfully!

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

nf-core/nanoseq execution completed unsuccessfully!

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

The full error message was:

-
${errorReport}
-
- """ -} else { - out << """ -
+
${errorReport}
+
+ """ } else { out << """ +
nf-core/nanoseq execution completed successfully! -
- """ -} -%> +
+ """ } %> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
+$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> "" }.join("\n") %> - -
$k
$v
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> " + + + + + " }.join("\n") %> + +
+ $k + +
$v
+
-

nf-core/nanoseq

-

https://github.com/nf-core/nanoseq

- -
- - +

nf-core/nanoseq

+

https://github.com/nf-core/nanoseq

+
+ diff --git a/docs/README.md b/docs/README.md index cd206cc8..b8efb5f8 100644 --- a/docs/README.md +++ b/docs/README.md @@ -2,9 +2,9 @@ The nf-core/nanoseq documentation is split into the following pages: -* [Usage](usage.md) - * An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. -* [Output](output.md) - * An overview of the different results produced by the pipeline and how to interpret them. +- [Usage](usage.md) + - An overview of how the pipeline works, how to run it and a description of all of the different command-line flags. +- [Output](output.md) + - An overview of the different results produced by the pipeline and how to interpret them. You can find a lot more documentation about installing, configuring and running nf-core pipelines on the website: [https://nf-co.re](https://nf-co.re) diff --git a/lib/NfcoreSchema.groovy b/lib/NfcoreSchema.groovy index 40ab65f2..b3d092f8 100755 --- a/lib/NfcoreSchema.groovy +++ b/lib/NfcoreSchema.groovy @@ -27,7 +27,7 @@ class NfcoreSchema { /* groovylint-disable-next-line UnusedPrivateMethodParameter */ public static void validateParameters(workflow, params, log, schema_filename='nextflow_schema.json') { def has_error = false - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Check for nextflow core params and unexpected params def json = new File(getSchemaPath(workflow, schema_filename=schema_filename)).text def Map schemaParams = (Map) new JsonSlurper().parseText(json).get('definitions') @@ -135,7 +135,7 @@ class NfcoreSchema { } } - //=====================================================================// + //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// // Validate parameters against the schema InputStream input_stream = new File(getSchemaPath(workflow, schema_filename=schema_filename)).newInputStream() JSONObject raw_schema = new JSONObject(new JSONTokener(input_stream)) From b3f03294a7dbce446d606551da45fc59df2888c0 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Fri, 22 Apr 2022 09:55:45 +0200 Subject: [PATCH 110/169] Local lint passing --- modules/nf-core/modules/multiqc/main.nf | 31 ------------------ modules/nf-core/modules/multiqc/meta.yml | 40 ------------------------ 2 files changed, 71 deletions(-) delete mode 100644 modules/nf-core/modules/multiqc/main.nf delete mode 100644 modules/nf-core/modules/multiqc/meta.yml diff --git a/modules/nf-core/modules/multiqc/main.nf b/modules/nf-core/modules/multiqc/main.nf deleted file mode 100644 index 1264aac1..00000000 --- a/modules/nf-core/modules/multiqc/main.nf +++ /dev/null @@ -1,31 +0,0 @@ -process MULTIQC { - label 'process_medium' - - conda (params.enable_conda ? 'bioconda::multiqc=1.12' : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/multiqc:1.12--pyhdfd78af_0' : - 'quay.io/biocontainers/multiqc:1.12--pyhdfd78af_0' }" - - input: - path multiqc_files - - output: - path "*multiqc_report.html", emit: report - path "*_data" , emit: data - path "*_plots" , optional:true, emit: plots - path "versions.yml" , emit: versions - - when: - task.ext.when == null || task.ext.when - - script: - def args = task.ext.args ?: '' - """ - multiqc -f $args . - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - multiqc: \$( multiqc --version | sed -e "s/multiqc, version //g" ) - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/multiqc/meta.yml b/modules/nf-core/modules/multiqc/meta.yml deleted file mode 100644 index 6fa891ef..00000000 --- a/modules/nf-core/modules/multiqc/meta.yml +++ /dev/null @@ -1,40 +0,0 @@ -name: MultiQC -description: Aggregate results from bioinformatics analyses across many samples into a single report -keywords: - - QC - - bioinformatics tools - - Beautiful stand-alone HTML report -tools: - - multiqc: - description: | - MultiQC searches a given directory for analysis logs and compiles a HTML report. - It's a general use tool, perfect for summarising the output from numerous bioinformatics tools. - homepage: https://multiqc.info/ - documentation: https://multiqc.info/docs/ - licence: ["GPL-3.0-or-later"] -input: - - multiqc_files: - type: file - description: | - List of reports / files recognised by MultiQC, for example the html and zip output of FastQC -output: - - report: - type: file - description: MultiQC report file - pattern: "multiqc_report.html" - - data: - type: dir - description: MultiQC data dir - pattern: "multiqc_data" - - plots: - type: file - description: Plots created by MultiQC - pattern: "*_data" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@abhi18av" - - "@bunop" - - "@drpatelh" From 8b7bd9d414b5938c92e1cae09fcd11caeddb8f58 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Fri, 22 Apr 2022 10:12:24 +0200 Subject: [PATCH 111/169] Make pretty --- CHANGELOG.md | 134 ++++++++++++------------ CITATIONS.md | 116 ++++++++++++--------- README.md | 40 +++---- assets/multiqc_config.yaml | 14 +-- docs/output.md | 208 ++++++++++++++++++------------------- docs/usage.md | 28 ++--- modules.json | 2 +- nextflow_schema.json | 5 +- 8 files changed, 282 insertions(+), 265 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3fe6399d..69625230 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,36 +7,36 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Major enhancements -* Add DNA variant calling functionality -* Add RNA modification and fusion detection functionalities -* Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set -* Add `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq -* Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - * Removed `--publish_dir_mode` as it is no longer required for the new syntax -* Bump minimum Nextflow version from 21.04.0 -> 21.10.3 -* Update pipeline template to nf-core/tools `2.2` -* Update `bambu` version from `1.0.2` to `2.0.0` -* Update `multiqc` version from `1.10.1` to `1.11` +- Add DNA variant calling functionality +- Add RNA modification and fusion detection functionalities +- Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set +- Add `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq +- Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules + - Removed `--publish_dir_mode` as it is no longer required for the new syntax +- Bump minimum Nextflow version from 21.04.0 -> 21.10.3 +- Update pipeline template to nf-core/tools `2.2` +- Update `bambu` version from `1.0.2` to `2.0.0` +- Update `multiqc` version from `1.10.1` to `1.11` ### Parameters -* Added `--output_demultiplex_fast5` to output demultiplexed fast5 -* Added `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq -* Added `--call_variants` to detect DNA variants -* Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms -* Added `--phase_vcf` to output a phased vcf -* Added `--skip_medaka` to skip `medaka_variant` -* Added `--skip_sniffles` to skip `sniffles` -* Added `--skip_modification_analysis` to skip RNA modification detection -* Added `--skip_xpore` to skip `xpore` -* Added `--skip_m6anet` to skip `m6anet` -* Added `--skip_fusion_analysis` to skip RNA fusion detection -* Added `--jaffal_ref_dir` to indicate the reference directory path required by `JAFFAL` +- Added `--output_demultiplex_fast5` to output demultiplexed fast5 +- Added `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq +- Added `--call_variants` to detect DNA variants +- Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms +- Added `--phase_vcf` to output a phased vcf +- Added `--skip_medaka` to skip `medaka_variant` +- Added `--skip_sniffles` to skip `sniffles` +- Added `--skip_modification_analysis` to skip RNA modification detection +- Added `--skip_xpore` to skip `xpore` +- Added `--skip_m6anet` to skip `m6anet` +- Added `--skip_fusion_analysis` to skip RNA fusion detection +- Added `--jaffal_ref_dir` to indicate the reference directory path required by `JAFFAL` ### Software dependencies | Dependency | Old version | New version | -|-------------------------|-------------|-------------| +| ----------------------- | ----------- | ----------- | | `bioconductor-bambu` | 1.0.2 | 2.0.0 | | `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | | `guppy` | 4.0.14 | 5.0.16 | @@ -50,77 +50,77 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Bug fix -* The `GET_TEST_DATA` process now uses checks for any file in the path. +- The `GET_TEST_DATA` process now uses checks for any file in the path. -> **NB:** Dependency has been __updated__ if both old and new version information is present. -> **NB:** Dependency has been __added__ if just the new version information is present. -> **NB:** Dependency has been __removed__ if version information isn't present. +> **NB:** Dependency has been **updated** if both old and new version information is present. +> **NB:** Dependency has been **added** if just the new version information is present. +> **NB:** Dependency has been **removed** if version information isn't present. ## [2.0.1] - 2021-11-29 ### Bug fix -* The `UCSC_BEDGRAPHTOBIGWIG` process now uses the `ucsc-bedgraphtobigwig` container -* The full-size and minimal AWS tests have successfully finished after changing to the `ucsc-bedgraphtobigwig` container +- The `UCSC_BEDGRAPHTOBIGWIG` process now uses the `ucsc-bedgraphtobigwig` container +- The full-size and minimal AWS tests have successfully finished after changing to the `ucsc-bedgraphtobigwig` container ## [2.0.0] - 2021-11-26 ### Major enhancements -* Pipeline has been re-implemented in [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) -* Software containers are now obtained from [Biocontainers](https://biocontainers.pro/#/registry) -* Update pipeline template to nf-core/tools `2.1` -* [#77](https://github.com/nf-core/nanoseq/issues/77) - Skipped alignment steps -* [#97](https://github.com/nf-core/nanoseq/issues/97) - Add optional DNA cleaning option +- Pipeline has been re-implemented in [Nextflow DSL2](https://www.nextflow.io/docs/latest/dsl2.html) +- Software containers are now obtained from [Biocontainers](https://biocontainers.pro/#/registry) +- Update pipeline template to nf-core/tools `2.1` +- [#77](https://github.com/nf-core/nanoseq/issues/77) - Skipped alignment steps +- [#97](https://github.com/nf-core/nanoseq/issues/97) - Add optional DNA cleaning option ### Parameters -* Added `--run_nanolyse` to run NanoLyse for DNA cleaning of FastQ files -* Added `--nanolyse_fasta` to provide a fasta file for nanolyse to filter against +- Added `--run_nanolyse` to run NanoLyse for DNA cleaning of FastQ files +- Added `--nanolyse_fasta` to provide a fasta file for nanolyse to filter against ### Software dependencies -| Dependency | Old version | New version | -|-------------------------|-------------|-------------| -| `bioconductor-bambu` | 1.0.0 | 1.0.2 | -| `nanolyse` | | 1.2.0 | -| `r-base` | 4.0.3 | 4.0.2 | +| Dependency | Old version | New version | +| -------------------- | ----------- | ----------- | +| `bioconductor-bambu` | 1.0.0 | 1.0.2 | +| `nanolyse` | | 1.2.0 | +| `r-base` | 4.0.3 | 4.0.2 | -> **NB:** Dependency has been __updated__ if both old and new version information is present. -> **NB:** Dependency has been __added__ if just the new version information is present. -> **NB:** Dependency has been __removed__ if version information isn't present. +> **NB:** Dependency has been **updated** if both old and new version information is present. +> **NB:** Dependency has been **added** if just the new version information is present. +> **NB:** Dependency has been **removed** if version information isn't present. ## [1.1.0] - 2020-11-06 ### Major enhancements -* Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/) and [`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/)) -* Differential expression analysis at the gene-level ([`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)) and transcript-level ([`DEXSeq`](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html)) -* Ability to provide BAM input to the pipeline -* Change samplesheet format to be more flexible to BAM input files -* Add pycoQC and featureCounts output to MultiQC report -* Add AWS full-sized test data -* Add parameter JSON schema for pipeline -* Add citations file -* Update pipeline template to nf-core/tools `1.11` -* Collapsible sections for output files in `docs/output.md` -* Replace `set` with `tuple` and `file` with `path` in `input` section of all processes -* Capitalise process names -* Added `--gpus all` to Docker `runOptions` when using GPU as mentioned [here](https://github.com/docker/compose/issues/6691#issuecomment-514429646) -* Cannot invoke method `containsKey()` on null object when `--igenomes_ignore` is set [#76](https://github.com/nf-core/nanoseq/issues/76) +- Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/) and [`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/)) +- Differential expression analysis at the gene-level ([`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html)) and transcript-level ([`DEXSeq`](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html)) +- Ability to provide BAM input to the pipeline +- Change samplesheet format to be more flexible to BAM input files +- Add pycoQC and featureCounts output to MultiQC report +- Add AWS full-sized test data +- Add parameter JSON schema for pipeline +- Add citations file +- Update pipeline template to nf-core/tools `1.11` +- Collapsible sections for output files in `docs/output.md` +- Replace `set` with `tuple` and `file` with `path` in `input` section of all processes +- Capitalise process names +- Added `--gpus all` to Docker `runOptions` when using GPU as mentioned [here](https://github.com/docker/compose/issues/6691#issuecomment-514429646) +- Cannot invoke method `containsKey()` on null object when `--igenomes_ignore` is set [#76](https://github.com/nf-core/nanoseq/issues/76) ### Parameters -* Added `--barcode_both_ends` requires barcode on both ends for Guppy basecaller -* Added `--quantification_method` to specify the transcript quantification method to use -* Added `--skip_quantification` to skip transcript quantification and differential analysis -* Added `--skip_differential_analysis` to skip differential analysis with DESeq2 and DEXSeq -* Added `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) +- Added `--barcode_both_ends` requires barcode on both ends for Guppy basecaller +- Added `--quantification_method` to specify the transcript quantification method to use +- Added `--skip_quantification` to skip transcript quantification and differential analysis +- Added `--skip_differential_analysis` to skip differential analysis with DESeq2 and DEXSeq +- Added `--publish_dir_mode` to customise method of publishing results to output directory [nf-core/tools#585](https://github.com/nf-core/tools/issues/585) ### Software dependencies | Dependency | Old version | New version | -|-------------------------|-------------|-------------| +| ----------------------- | ----------- | ----------- | | `Guppy` | 3.4.4 | 4.0.14 | | `markdown` | 3.1.1 | 3.3.3 | | `multiqc` | 1.8 | 1.9 | @@ -143,9 +143,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `subread` | - | 2.0.1 | | `psutil` | - | - | -> **NB:** Dependency has been __updated__ if both old and new version information is present. -> **NB:** Dependency has been __added__ if just the new version information is present. -> **NB:** Dependency has been __removed__ if version information isn't present. +> **NB:** Dependency has been **updated** if both old and new version information is present. +> **NB:** Dependency has been **added** if just the new version information is present. +> **NB:** Dependency has been **removed** if version information isn't present. ## [1.0.0] - 2020-03-05 diff --git a/CITATIONS.md b/CITATIONS.md index 9750d4f3..7e2b314b 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -10,81 +10,101 @@ ## Pipeline tools -* [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) - > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. +- [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) + > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. -* [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) - > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. +- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) -* [GraphMap](https://pubmed.ncbi.nlm.nih.gov/27079541/) - > Sović I, Šikić M, Wilm A, Fenlon SN, Chen S, Nagarajan N. Fast and sensitive mapping of nanopore sequencing reads with GraphMap. Nat Commun. 2016 Apr 15;7:11307. doi: 10.1038/ncomms11307. PMID: 27079541; PMCID: PMC4835549. +- [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) -* [Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis) + > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. -* [JAFFAL](https://doi.org/10.1186/s13059-021-02588-5) - > Davidson NM, et al., JAFFAL: detecting fusion genes with long-read transcriptome sequencing. Genome Biology (2022) +- [GraphMap](https://pubmed.ncbi.nlm.nih.gov/27079541/) -* [m6anet](https://www.biorxiv.org/content/10.1101/2021.09.20.461055v1) - > Hendra C, et al., Detection of m6A from direct RNA sequencing using a Multiple Instance Learning framework. bioRXiv (2021) + > Sović I, Šikić M, Wilm A, Fenlon SN, Chen S, Nagarajan N. Fast and sensitive mapping of nanopore sequencing reads with GraphMap. Nat Commun. 2016 Apr 15;7:11307. doi: 10.1038/ncomms11307. PMID: 27079541; PMCID: PMC4835549. -* [Minimap2](https://pubmed.ncbi.nlm.nih.gov/29750242/) - > Li H. Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics. 2018 Sep 15;34(18):3094-3100. doi: 10.1093/bioinformatics/bty191. PMID: 29750242; PMCID: PMC6137996. +- [Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis) -* [Medaka](https://github.com/nanoporetech/medaka) +- [JAFFAL](https://doi.org/10.1186/s13059-021-02588-5) -* [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) - > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. + > Davidson NM, et al., JAFFAL: detecting fusion genes with long-read transcriptome sequencing. Genome Biology (2022) -* [NanoLyse](https://pubmed.ncbi.nlm.nih.gov/29547981/) - > De Coster, W., D’Hert, S., Schultz, D. T., Cruts, M., & Van Broeckhoven, C. (2018). NanoPack: visualizing and processing long-read sequencing data. Bioinformatics, 34(15), 2666-2669. PubMed PMID: 29547981; PubMed Central PMCID: PMC6061794. +- [m6anet](https://www.biorxiv.org/content/10.1101/2021.09.20.461055v1) -* [NanoPlot](https://pubmed.ncbi.nlm.nih.gov/29547981/) - > De Coster W, D'Hert S, Schultz DT, Cruts M, Van Broeckhoven C. NanoPack: visualizing and processing long-read sequencing data. Bioinformatics. 2018 Aug 1;34(15):2666-2669. doi: 10.1093/bioinformatics/bty149. PubMed PMID: 29547981; PubMed Central PMCID: PMC6061794. + > Hendra C, et al., Detection of m6A from direct RNA sequencing using a Multiple Instance Learning framework. bioRXiv (2021) -* [pycoQC](https://doi.org/10.21105/joss.01236) - > Leger A, Leonardi T, (2019). pycoQC, interactive quality control for Oxford Nanopore Sequencing. Journal of Open Source Software, 4(34), 1236. +- [Minimap2](https://pubmed.ncbi.nlm.nih.gov/29750242/) -* [qcat](https://github.com/nanoporetech/qcat) + > Li H. Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics. 2018 Sep 15;34(18):3094-3100. doi: 10.1093/bioinformatics/bty191. PMID: 29750242; PMCID: PMC6137996. -* [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) - > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. +- [Medaka](https://github.com/nanoporetech/medaka) -* [Sniffles](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5990442/) - > Sedlazeck FJ, Rescheneder P, Smolka M, Fang H, Nattestad M, von Haeseler A, Schatz MC. Accurate detection of complex structural variations using single-molecule sequencing. Nat Methods. 2018 Jun;15(6):461-468. doi: 10 1038/s41592-018-0001-7. Epub 2018 Apr 30. PMID: 29713083; PMCID: PMC5990442. +- [MultiQC](https://www.ncbi.nlm.nih.gov/pubmed/27312411/) -* [StringTie2](https://www.ncbi.nlm.nih.gov/pubmed/31842956/) - > Kovaka S, Zimin AV, Pertea GM, Razaghi R, Salzberg SL, Pertea M. Transcriptome assembly from long-read RNA-seq alignments with StringTie2 Genome Biol. 2019 Dec 16;20(1):278. doi: 10.1186/s13059-019-1910-1. PubMed PMID: 31842956; PubMed Central PMCID: PMC6912988. + > Ewels P, Magnusson M, Lundin S, Käller M. MultiQC: summarize analysis results for multiple tools and samples in a single report. Bioinformatics. 2016 Oct 1;32(19):3047-8. doi: 10.1093/bioinformatics/btw354. Epub 2016 Jun 16. PubMed PMID: 27312411; PubMed Central PMCID: PMC5039924. -* [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) - > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. +- [NanoLyse](https://pubmed.ncbi.nlm.nih.gov/29547981/) -* [xPore](https://doi.org/10.1038/s41587-021-00949-w) - > Pratanwanich PN, et al.,Identification of differential RNA modifications from nanopore direct RNA sequencing with xPore. Nat Biotechnol (2021) + > De Coster, W., D’Hert, S., Schultz, D. T., Cruts, M., & Van Broeckhoven, C. (2018). NanoPack: visualizing and processing long-read sequencing data. Bioinformatics, 34(15), 2666-2669. PubMed PMID: 29547981; PubMed Central PMCID: PMC6061794. + +- [NanoPlot](https://pubmed.ncbi.nlm.nih.gov/29547981/) + + > De Coster W, D'Hert S, Schultz DT, Cruts M, Van Broeckhoven C. NanoPack: visualizing and processing long-read sequencing data. Bioinformatics. 2018 Aug 1;34(15):2666-2669. doi: 10.1093/bioinformatics/bty149. PubMed PMID: 29547981; PubMed Central PMCID: PMC6061794. + +- [pycoQC](https://doi.org/10.21105/joss.01236) + + > Leger A, Leonardi T, (2019). pycoQC, interactive quality control for Oxford Nanopore Sequencing. Journal of Open Source Software, 4(34), 1236. + +- [qcat](https://github.com/nanoporetech/qcat) + +- [SAMtools](https://www.ncbi.nlm.nih.gov/pubmed/19505943/) + + > Li H, Handsaker B, Wysoker A, Fennell T, Ruan J, Homer N, Marth G, Abecasis G, Durbin R; 1000 Genome Project Data Processing Subgroup. The Sequence Alignment/Map format and SAMtools. Bioinformatics. 2009 Aug 15;25(16):2078-9. doi: 10.1093/bioinformatics/btp352. Epub 2009 Jun 8. PubMed PMID: 19505943; PubMed Central PMCID: PMC2723002. + +- [Sniffles](https://www.ncbi.nlm.nih.gov/pmc/articles/PMC5990442/) + + > Sedlazeck FJ, Rescheneder P, Smolka M, Fang H, Nattestad M, von Haeseler A, Schatz MC. Accurate detection of complex structural variations using single-molecule sequencing. Nat Methods. 2018 Jun;15(6):461-468. doi: 10 1038/s41592-018-0001-7. Epub 2018 Apr 30. PMID: 29713083; PMCID: PMC5990442. + +- [StringTie2](https://www.ncbi.nlm.nih.gov/pubmed/31842956/) + + > Kovaka S, Zimin AV, Pertea GM, Razaghi R, Salzberg SL, Pertea M. Transcriptome assembly from long-read RNA-seq alignments with StringTie2 Genome Biol. 2019 Dec 16;20(1):278. doi: 10.1186/s13059-019-1910-1. PubMed PMID: 31842956; PubMed Central PMCID: PMC6912988. + +- [UCSC tools](https://www.ncbi.nlm.nih.gov/pubmed/20639541/) + + > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. + +- [xPore](https://doi.org/10.1038/s41587-021-00949-w) + > Pratanwanich PN, et al.,Identification of differential RNA modifications from nanopore direct RNA sequencing with xPore. Nat Biotechnol (2021) ## R packages -* [R](https://www.R-project.org/) - > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. +- [R](https://www.R-project.org/) + + > R Core Team (2017). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. + +- [bambu](https://bioconductor.org/packages/release/bioc/html/bambu.html) + + > Chen Y, Goeke J, Wan YK (2020). bambu: Reference-guided isoform reconstruction and quantification for long read RNA-Seq data. R package version 1.0.0. + +- [BSgenome](https://bioconductor.org/packages/release/bioc/html/BSgenome.html) + + > Pagès H (2020). BSgenome: Software infrastructure for efficient representation of full genomes and their SNPs. doi: 10.18129/B9.bioc.BSgenome. + +- [DESeq2](https://www.ncbi.nlm.nih.gov/pubmed/25516281/) -* [bambu](https://bioconductor.org/packages/release/bioc/html/bambu.html) - > Chen Y, Goeke J, Wan YK (2020). bambu: Reference-guided isoform reconstruction and quantification for long read RNA-Seq data. R package version 1.0.0. + > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. -* [BSgenome](https://bioconductor.org/packages/release/bioc/html/BSgenome.html) - > Pagès H (2020). BSgenome: Software infrastructure for efficient representation of full genomes and their SNPs. doi: 10.18129/B9.bioc.BSgenome. +- [DEXSeq](https://pubmed.ncbi.nlm.nih.gov/22722343/) -* [DESeq2](https://www.ncbi.nlm.nih.gov/pubmed/25516281/) - > Love MI, Huber W, Anders S. Moderated estimation of fold change and dispersion for RNA-seq data with DESeq2. Genome Biol. 2014;15(12):550. PubMed PMID: 25516281; PubMed Central PMCID: PMC4302049. + > Anders S, Reyes A, Huber W. Detecting differential usage of exons from RNA-seq data. Genome Res. 2012 Oct;22(10):2008-17. doi: 10.1101/gr.133744.111. Epub 2012 Jun 21. PubMed PMID: 22722343; PubMed Central PMCID: PMC3460195. -* [DEXSeq](https://pubmed.ncbi.nlm.nih.gov/22722343/) - > Anders S, Reyes A, Huber W. Detecting differential usage of exons from RNA-seq data. Genome Res. 2012 Oct;22(10):2008-17. doi: 10.1101/gr.133744.111. Epub 2012 Jun 21. PubMed PMID: 22722343; PubMed Central PMCID: PMC3460195. +- [DRIMSeq](https://pubmed.ncbi.nlm.nih.gov/28105305/) -* [DRIMSeq](https://pubmed.ncbi.nlm.nih.gov/28105305/) - > Nowicka M, Robinson MD. DRIMSeq: a Dirichlet-multinomial framework for multivariate count outcomes in genomics. F1000Res. 2016 Jun 13;5:1356. doi: 10.12688/f1000research.8900.2. PubMed PMID: 28105305; PubMed Central PMCID: PMC5200948. + > Nowicka M, Robinson MD. DRIMSeq: a Dirichlet-multinomial framework for multivariate count outcomes in genomics. F1000Res. 2016 Jun 13;5:1356. doi: 10.12688/f1000research.8900.2. PubMed PMID: 28105305; PubMed Central PMCID: PMC5200948. -* [stageR](https://pubmed.ncbi.nlm.nih.gov/28784146/) - > Van den Berge K, Soneson C, Robinson MD, Clement L. stageR: a general stage-wise method for controlling the gene-level false discovery rate in differential expression and differential transcript usage. Genome Biol. 2017 Aug 7;18(1):151. doi: 10.1186/s13059-017-1277-0. PubMed PMID: 28784146; PubMed Central PMCID: PMC5547545. +- [stageR](https://pubmed.ncbi.nlm.nih.gov/28784146/) + > Van den Berge K, Soneson C, Robinson MD, Clement L. stageR: a general stage-wise method for controlling the gene-level false discovery rate in differential expression and differential transcript usage. Genome Biol. 2017 Aug 7;18(1):151. doi: 10.1186/s13059-017-1277-0. PubMed PMID: 28784146; PubMed Central PMCID: PMC5547545. ## Software packaging/containerisation tools diff --git a/README.md b/README.md index 4ae0867d..08115fd5 100644 --- a/README.md +++ b/README.md @@ -25,24 +25,24 @@ On release, automated continuous integration tests run the pipeline on a [full-s ## Pipeline Summary -1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis), [`demux_fast5`](https://github.com/nanoporetech/ont_fast5_api#demux_fast5) or [`qcat`](https://github.com/nanoporetech/qcat); *optional*) +1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis), [`demux_fast5`](https://github.com/nanoporetech/ont_fast5_api#demux_fast5) or [`qcat`](https://github.com/nanoporetech/qcat); _optional_) 2. Sequencing QC ([`pycoQC`](https://github.com/a-slide/pycoQC), [`NanoPlot`](https://github.com/wdecoster/NanoPlot)) -3. Raw read DNA cleaning ([NanoLyse](https://github.com/wdecoster/nanolyse); *optional*) +3. Raw read DNA cleaning ([NanoLyse](https://github.com/wdecoster/nanolyse); _optional_) 4. Raw read QC ([`NanoPlot`](https://github.com/wdecoster/NanoPlot), [`FastQC`](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) 5. Alignment ([`GraphMap2`](https://github.com/lbcb-sci/graphmap2) or [`minimap2`](https://github.com/lh3/minimap2)) - * Both aligners are capable of performing unspliced and spliced alignment. Sensible defaults will be applied automatically based on a combination of the input data and user-specified parameters - * Each sample can be mapped to its own reference genome if multiplexed in this way - * Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) + - Both aligners are capable of performing unspliced and spliced alignment. Sensible defaults will be applied automatically based on a combination of the input data and user-specified parameters + - Each sample can be mapped to its own reference genome if multiplexed in this way + - Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation 7. DNA-specific downstream analysis: - * DNA variant calling ([`medaka`](https://github.com/nanoporetech/medaka) and/or [`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) + - DNA variant calling ([`medaka`](https://github.com/nanoporetech/medaka) and/or [`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) 8. RNA-specific downstream analysis: - * Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) - * bambu performs both transcript reconstruction and quantification. - * When StringTie2 is chosen, each sample can be processed individually and combined. After which, [`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/) will be used for both gene and transcript quantification. - * Differential expression analysis ([`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html) and/or [`DEXSeq`](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html)) - * RNA modification detection ([`xpore`](https://github.com/GoekeLab/xpore) and/or [`m6anet`](https://github.com/GoekeLab/m6anet)) - * RNA fusion detection ([`JAFFAL`](https://github.com/Oshlack/JAFFA)) + - Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) + - bambu performs both transcript reconstruction and quantification. + - When StringTie2 is chosen, each sample can be processed individually and combined. After which, [`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/) will be used for both gene and transcript quantification. + - Differential expression analysis ([`DESeq2`](https://bioconductor.org/packages/release/bioc/html/DESeq2.html) and/or [`DEXSeq`](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html)) + - RNA modification detection ([`xpore`](https://github.com/GoekeLab/xpore) and/or [`m6anet`](https://github.com/GoekeLab/m6anet)) + - RNA fusion detection ([`JAFFAL`](https://github.com/Oshlack/JAFFA)) 9. Present QC for raw read and alignment results ([`MultiQC`](https://multiqc.info/docs/)) ### Functionality Overview @@ -61,16 +61,16 @@ A graphical overview of suggested routes through the pipeline depending on the d 3. Download the pipeline and test it on a minimal dataset with a single command: - ```console - nextflow run nf-core/nanoseq -profile test,YOURPROFILE - ``` + ```console + nextflow run nf-core/nanoseq -profile test,YOURPROFILE + ``` - Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. + Note that some form of configuration will be needed so that Nextflow knows how to fetch the required software. This is usually done in the form of a config profile (`YOURPROFILE` in the example command above). You can chain multiple config profiles in a comma-separated string. - > * The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. - > * Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. - > * If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. - > * If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. + > - The pipeline comes with config profiles called `docker`, `singularity`, `podman`, `shifter`, `charliecloud` and `conda` which instruct the pipeline to use the named tool for software management. For example, `-profile test,docker`. + > - Please check [nf-core/configs](https://github.com/nf-core/configs#documentation) to see if a custom config file to run nf-core pipelines already exists for your Institute. If so, you can simply use `-profile ` in your command. This will enable either `docker` or `singularity` and set the appropriate execution settings for your local compute environment. + > - If you are using `singularity` and are persistently observing issues downloading Singularity images directly due to timeout or network issues, then you can use the `--singularity_pull_docker_container` parameter to pull and convert the Docker image instead. Alternatively, you can use the [`nf-core download`](https://nf-co.re/tools/#downloading-pipelines-for-offline-use) command to download images first, before running the pipeline. Setting the [`NXF_SINGULARITY_CACHEDIR` or `singularity.cacheDir`](https://www.nextflow.io/docs/latest/singularity.html?#singularity-docker-hub) Nextflow options enables you to store and re-use the images from a central location for future pipeline runs. + > - If you are using `conda`, it is highly recommended to use the [`NXF_CONDA_CACHEDIR` or `conda.cacheDir`](https://www.nextflow.io/docs/latest/conda.html) settings to store the environments in a central location for future pipeline runs. 4. Start running your own analysis! diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml index 365f1651..df14117a 100644 --- a/assets/multiqc_config.yaml +++ b/assets/multiqc_config.yaml @@ -1,11 +1,11 @@ report_comment: > - This report has been generated by the nf-core/nanoseq - analysis pipeline. For information about how to interpret these results, please see the - documentation. + This report has been generated by the nf-core/nanoseq + analysis pipeline. For information about how to interpret these results, please see the + documentation. report_section_order: - software_versions: - order: -1000 - nf-core-nanoseq-summary: - order: -1001 + software_versions: + order: -1000 + nf-core-nanoseq-summary: + order: -1001 export_plots: true diff --git a/docs/output.md b/docs/output.md index 545684e8..61f12ad4 100644 --- a/docs/output.md +++ b/docs/output.md @@ -19,55 +19,55 @@ The directories listed below will be created in the output directory after the p
Output files -* `guppy/fastq/` - Merged fastq output files for each barcode. -* `guppy/basecalling//` - fastq output files for each barcode. -* `guppy/basecalling/unclassified/` - fastq files with reads were unassigned to any given barcode. -* `guppy/basecalling/sequencing_summary.txt` - Sequencing summary file generated by *Guppy*. -* `guppy/basecalling/sequencing_telemetry.js` - Sequencing telemetry file generated by *Guppy*. -* `guppy/basecalling/guppy_basecaller_log-.log` - Log file for *Guppy* execution. -* `demux_fast5/demultiplexed_fast5//` - fast5 output files for each barcode. -* `demux_fast5/demultiplexed_fast5/unclassified/` - fast5 files with reads were unassigned to any given barcode. -* `qcat/fastq/.fastq.gz` - fastq output files for each barcode. -* `qcat/fastq/none.fastq.gz` - fastq file with reads were unassigned to any given barcode. +- `guppy/fastq/` + Merged fastq output files for each barcode. +- `guppy/basecalling//` + fastq output files for each barcode. +- `guppy/basecalling/unclassified/` + fastq files with reads were unassigned to any given barcode. +- `guppy/basecalling/sequencing_summary.txt` + Sequencing summary file generated by _Guppy_. +- `guppy/basecalling/sequencing_telemetry.js` + Sequencing telemetry file generated by _Guppy_. +- `guppy/basecalling/guppy_basecaller_log-.log` + Log file for _Guppy_ execution. +- `demux_fast5/demultiplexed_fast5//` + fast5 output files for each barcode. +- `demux_fast5/demultiplexed_fast5/unclassified/` + fast5 files with reads were unassigned to any given barcode. +- `qcat/fastq/.fastq.gz` + fastq output files for each barcode. +- `qcat/fastq/none.fastq.gz` + fastq file with reads were unassigned to any given barcode.
-*Documentation*: +_Documentation_: [Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux_fast5](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) -*Description*: +_Description_: The pipeline has been written to deal with the various scenarios where you would like to include/exclude the basecalling and demultiplexing steps. This will be dependent on what type of input data you would like to provide the pipeline. Additionally, if you would like to align your samples to a reference genome there are various options for providing this information. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet, associated commands and how to provide reference genome data. -*Guppy* will be used to basecall and demultiplex the data. Various options have been provided to customise specific parameters and to be able to run *Guppy* on GPUs. +_Guppy_ will be used to basecall and demultiplex the data. Various options have been provided to customise specific parameters and to be able to run _Guppy_ on GPUs. -*demux_fast5* will demultiplex the fast5 files, gives the *Guppy* summary file. +_demux_fast5_ will demultiplex the fast5 files, gives the _Guppy_ summary file. -If you have a pre-basecalled fastq file then *qcat* will be used to perform the demultiplexing if you provide the `--skip_basecalling` parameter. If you would like to skip both of these steps entirely then you can provide `--skip_basecalling --skip_demultiplexing` when running the pipeline. As a result, the structure of the output folder will depend on which steps you have chosen to run in the pipeline. +If you have a pre-basecalled fastq file then _qcat_ will be used to perform the demultiplexing if you provide the `--skip_basecalling` parameter. If you would like to skip both of these steps entirely then you can provide `--skip_basecalling --skip_demultiplexing` when running the pipeline. As a result, the structure of the output folder will depend on which steps you have chosen to run in the pipeline. ## Removal of DNA contaminants
Output files -* `nanolyse/.clean.fastq.gz` - FastQ file after the removal of reads mapping to DNA contaminants. +- `nanolyse/.clean.fastq.gz` + FastQ file after the removal of reads mapping to DNA contaminants.
-*Documentation*: +_Documentation_: [NanoLyse](https://github.com/wdecoster/nanolyse) -*Description*: +_Description_: If you would like to run NanoLyse on the raw FastQ files then you can provide `--run_nanolyse` when running the pipeline. By default, the pipeline will filter the raw reads relative to lambda phage but you can provide your own fasta file of "contaminants" with `--nanolyse_fasta`. The filtered FastQ files will contain raw reads without the provided reference sequences (default: lambda phage sequences). ## Sequencing QC @@ -75,18 +75,18 @@ If you would like to run NanoLyse on the raw FastQ files then you can provide `-
Output files -* `pycoqc/pycoqc.html` - `*.html` file that includes a run summary and graphical representation of various QC metrics including distribution of read length, distribution of read quality scores, mean read quality per sequence length, output per channel over experiment time and percentage of reads per barcode. -* `nanoplot/summary/` - `*.html` files for QC metrics and individual `*.png` image files for plots. +- `pycoqc/pycoqc.html` + `*.html` file that includes a run summary and graphical representation of various QC metrics including distribution of read length, distribution of read quality scores, mean read quality per sequence length, output per channel over experiment time and percentage of reads per barcode. +- `nanoplot/summary/` + `*.html` files for QC metrics and individual `*.png` image files for plots.
-*Documentation*: +_Documentation_: [PycoQC](https://github.com/a-slide/pycoQC), [NanoPlot](https://github.com/wdecoster/NanoPlot) -*Description*: -*PycoQC* and *NanoPlot* compute metrics and generate QC plots using the sequencing summary information generated by *Guppy* e.g. distribution of read length, read length over time, number of reads per barcode and other general stats. *NanoPlot* also generates QC metrics directly from fastq files as described in the next section. +_Description_: +_PycoQC_ and _NanoPlot_ compute metrics and generate QC plots using the sequencing summary information generated by _Guppy_ e.g. distribution of read length, read length over time, number of reads per barcode and other general stats. _NanoPlot_ also generates QC metrics directly from fastq files as described in the next section. ![PycoQC - Number of reads per barcode](images/pycoqc_readsperbarcode.png) @@ -95,44 +95,44 @@ If you would like to run NanoLyse on the raw FastQ files then you can provide `-
Output files -* `nanoplot/fastq//` - Per-sample `*.html` files for QC metrics and individual `*.png` image files for plots. -* `fastqc/` - *FastQC* `*.html` and `*.zip` files. +- `nanoplot/fastq//` + Per-sample `*.html` files for QC metrics and individual `*.png` image files for plots. +- `fastqc/` + _FastQC_ `*.html` and `*.zip` files.
-*Documentation*: +_Documentation_: [NanoPlot](https://github.com/wdecoster/NanoPlot), [FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/) -*Description*: -*NanoPlot* can also be used to produce general quality metrics from the per-barcode fastq files generated by *Guppy* e.g. quality score distribution, read lengths and other general stats. +_Description_: +_NanoPlot_ can also be used to produce general quality metrics from the per-barcode fastq files generated by _Guppy_ e.g. quality score distribution, read lengths and other general stats. ![Nanoplot - Read quality vs read length](images/nanoplot_readlengthquality.png) -*FastQC* gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). You get information about adapter contamination and other overrepresented sequences. +_FastQC_ gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). You get information about adapter contamination and other overrepresented sequences. ## Alignment
Output files -* `/bam` - Per-sample coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. -* `/bam_index` - Per-sample coordinate sorted alignment index files in [`*.bai`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. -* `/samtools_stats/` - *SAMtools* `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files. +- `/bam` + Per-sample coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. +- `/bam_index` + Per-sample coordinate sorted alignment index files in [`*.bai`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. +- `/samtools_stats/` + _SAMtools_ `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files.
-*Documentation*: +_Documentation_: [GraphMap2](https://github.com/lbcb-sci/graphmap2), [MiniMap2](https://github.com/lh3/minimap2), [SAMtools](http://samtools.sourceforge.net/) -*Description*: -Reads are mapped to a user-defined genome or transcriptome using either *GraphMap2* or *Minimap2*, and the resulting BAM files are sorted and indexed. If the same reference is specified multiple times in the input sample sheet then the aligner index will only be built once for re-use across all samples. You can skip the alignment and downstream processes by providing the `--skip_alignment` parameter. +_Description_: +Reads are mapped to a user-defined genome or transcriptome using either _GraphMap2_ or _Minimap2_, and the resulting BAM files are sorted and indexed. If the same reference is specified multiple times in the input sample sheet then the aligner index will only be built once for re-use across all samples. You can skip the alignment and downstream processes by providing the `--skip_alignment` parameter. -The initial SAM alignment files created by *GraphMap2* or *Minimap2* are not saved by default to be more efficient with storage space. You can override this behaviour with the use of the `--save_align_intermeds` parameter. +The initial SAM alignment files created by _GraphMap2_ or _Minimap2_ are not saved by default to be more efficient with storage space. You can override this behaviour with the use of the `--save_align_intermeds` parameter. ![MultiQC - SAMtools stats plot](images/mqc_samtools_stats_plot.png) @@ -141,17 +141,17 @@ The initial SAM alignment files created by *GraphMap2* or *Minimap2* are not sav
Output files -* `/bigwig/` - Per-sample `*.bigWig` files. -* `/bigbed/` - Per-sample `*.bigBed` files. +- `/bigwig/` + Per-sample `*.bigWig` files. +- `/bigbed/` + Per-sample `*.bigBed` files.
-*Documentation*: +_Documentation_: [BEDTools](https://bedtools.readthedocs.io/en/latest/), [bedGraphToBigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html#Ex3), [`bedToBigBed`](https://genome.ucsc.edu/goldenPath/help/bigBed.html#Ex2) -*Description*: +_Description_: The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in an indexed binary format useful for displaying dense, continuous data in Genome Browsers such as the [UCSC](https://genome.ucsc.edu/cgi-bin/hgTracks) and [IGV](http://software.broadinstitute.org/software/igv/). This mitigates the need to load the much larger BAM files for data visualisation purposes which will be slower and result in memory issues. The bigWig format is also supported by various bioinformatics software for downstream processing such as meta-profile plotting. [bigBed](https://genome.ucsc.edu/goldenPath/help/bigBed.html) are more useful for displaying distribution of reads across exon intervals as is typically observed for RNA-seq data. Therefore, these files will only be generated if `--protocol directRNA` or `--protocol cDNA` are defined. @@ -163,18 +163,18 @@ The creation of these files can be bypassed by setting the parameters `--skip_bi
Output files -* `minimap2/medaka//round_1.vcf` - VCF file with small variants for each sample. -* `minimap2/sniffles/_sniffles.vcf` - VCF files with unflitered structural variants. +- `minimap2/medaka//round_1.vcf` + VCF file with small variants for each sample. +- `minimap2/sniffles/_sniffles.vcf` + VCF files with unflitered structural variants.
-*Documentation*: +_Documentation_: [Medaka](https://github.com/nanoporetech/medaka), [Sniffles](https://github.com/fritzsedlazeck/Sniffles) -*Description*: -If the protocol is set to `--protocol DNA` and the *Minimap2* aligner was used, then the `--call_variants` parameter can be invoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. +_Description_: +If the protocol is set to `--protocol DNA` and the _Minimap2_ aligner was used, then the `--call_variants` parameter can be invoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. ## Transcript Reconstruction and Quantification @@ -183,31 +183,31 @@ If the protocol is set to `--protocol DNA` and the *Minimap2* aligner was used, If bambu is used: -* `bambu/` - * `extended_annotations.gtf` - a gtf file that contains both annotated and novel transcripts - * `counts_gene.txt` - gene expression estimates - * `counts_transcript.txt` - transcript expression estimates +- `bambu/` + - `extended_annotations.gtf` - a gtf file that contains both annotated and novel transcripts + - `counts_gene.txt` - gene expression estimates + - `counts_transcript.txt` - transcript expression estimates If StringTie2 is used: -* `stringtie2/` - * `*.bam` - Per-sample coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. - * `*.stringtie.gtf` - Per-sample annotations for novel transcripts obtained in *StringTie2*. - * `stringtie.merged.gtf` - Extended annotation that combines provided gtf with gtf files from each sample via *StringTie2 Merge*. - * `counts_gene.txt` - gene expression estimates calculated by featureCounts. - * `counts_gene.txt.summary` - featureCounts gene level log file. - * `counts_transcript.txt` - transcript expression estimates calculated by featureCounts. - * `counts_transcript.txt.summary` - featureCounts transcript level log file. +- `stringtie2/` + - `*.bam` + Per-sample coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. + - `*.stringtie.gtf` + Per-sample annotations for novel transcripts obtained in _StringTie2_. + - `stringtie.merged.gtf` + Extended annotation that combines provided gtf with gtf files from each sample via _StringTie2 Merge_. + - `counts_gene.txt` - gene expression estimates calculated by featureCounts. + - `counts_gene.txt.summary` - featureCounts gene level log file. + - `counts_transcript.txt` - transcript expression estimates calculated by featureCounts. + - `counts_transcript.txt.summary` - featureCounts transcript level log file. -*Documentation*: +_Documentation_: [bambu](https://bioconductor.org/packages/release/bioc/html/bambu.html), [StringTie2](https://ccb.jhu.edu/software/stringtie/), [featureCounts](http://bioinf.wehi.edu.au/featureCounts/) -*Description*: +_Description_: After genomic alignment, novel transcripts can be reconstructed using tools such as bambu and StringTie2. Quantification can then be performed on a more complete annotation based on the transcripts detected within a given set of samples. bambu performs both the reconstruction and quantification steps. An an alternative approach, we also provides an option to run StringTie2 to identify novel transcripts. However, when multiple samples are provided, quantification for multiple samples are not implemented explicitly in the software. Hence a second step is required to merge novel transcripts across multiple samples followed by quantification for both gene and transcripts using featureCounts. You can skip transcript reconstruction and quantification by providing the `--skip_quantification` parameter. ## Differential expression analysis @@ -215,15 +215,15 @@ After genomic alignment, novel transcripts can be reconstructed using tools such
Output files -* `/deseq2/deseq2.results.txt` - a `.txt` file that contains differential expression results for genes. -* `/dexseq/dexseq.results.txt` - a `.txt` file that contains differential expression results for transcripts. +- `/deseq2/deseq2.results.txt` - a `.txt` file that contains differential expression results for genes. +- `/dexseq/dexseq.results.txt` - a `.txt` file that contains differential expression results for transcripts.
-*Documentation*: +_Documentation_: [DESeq2](https://bioconductor.org/packages/release/bioc/html/DESeq2.html), [DEXSeq](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html) -*Description*: +_Description_: If multiple conditions and multiple replicates are available then the pipeline is able to run differential analysis on gene and transcripts with DESeq2 and DEXSeq, respectively. These steps won't be run if you provide the `--skip_quantification` or `--skip_differential_analysis` parameters or if all of the samples in the samplesheet don't have the same fasta and GTF reference files. ## RNA modification analysis @@ -231,15 +231,15 @@ If multiple conditions and multiple replicates are available then the pipeline i
Output files -* `rna_modifications/xpore/diffmod/diffmod_outputs/diffmod.table` - a `.csv` file that contains differentially modified sites. -* `rna_modifications/m6anet/inference//data.result.csv.gz` - a `.csv` file that contains detected m6A sites. +- `rna_modifications/xpore/diffmod/diffmod_outputs/diffmod.table` - a `.csv` file that contains differentially modified sites. +- `rna_modifications/m6anet/inference//data.result.csv.gz` - a `.csv` file that contains detected m6A sites.
-*Documentation*: +_Documentation_: [xPore](https://xpore.readthedocs.io/en/latest/), [m6anet](https://m6anet.readthedocs.io/en/latest/) -*Description*: +_Description_: If multiple conditions are available then the pipeline is able to run differential modification analysis with xPore. These steps won't be run if you provide the `--skip_modification_analysis` or `--skip_xpore` or `--skip_m6anet` parameters. ## RNA fusion analysis @@ -247,15 +247,15 @@ If multiple conditions are available then the pipeline is able to run differenti
Output files -* `jaffal/jaffa_results.csv` - a `.csv` file that contains detected RNA fusion results. -* `jaffal/jaffa_results.fasta` - a `.fasta` file that contains the sequence of the detected RNA fusions. +- `jaffal/jaffa_results.csv` - a `.csv` file that contains detected RNA fusion results. +- `jaffal/jaffa_results.fasta` - a `.fasta` file that contains the sequence of the detected RNA fusions.
-*Documentation*: +_Documentation_: [jaffal](https://github.com/Oshlack/JAFFA/wiki) -*Description*: +_Description_: This step won't be run if you provide the `--skip_fusion_analysis` parameter. ## MultiQC @@ -270,15 +270,15 @@ This step won't be run if you provide the `--skip_fusion_analysis` parameter. -*Documentation*: +_Documentation_: [MultiQC](https://multiqc.info/docs/) -*Description*: -*MultiQC* is a visualisation tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available within the report data directory. +_Description_: +_MultiQC_ is a visualisation tool that generates a single HTML report summarising all samples in your project. Most of the pipeline QC results are visualised in the report and further statistics are available within the report data directory. -Results generated by *MultiQC* for this pipeline collate QC from *FastQC*, *samtools flagstat*, *samtools idxstats* and *samtools stats*. +Results generated by _MultiQC_ for this pipeline collate QC from _FastQC_, _samtools flagstat_, _samtools idxstats_ and _samtools stats_. -The pipeline has special steps which also allow the software versions to be reported in the *MultiQC* output for future traceability. For more information about how to use *MultiQC* reports, see . +The pipeline has special steps which also allow the software versions to be reported in the _MultiQC_ output for future traceability. For more information about how to use _MultiQC_ reports, see . ## Pipeline information @@ -292,8 +292,8 @@ The pipeline has special steps which also allow the software versions to be repo -*Documentation*: +_Documentation_: [Nextflow](https://www.nextflow.io/docs/latest/tracing.html) -*Description*: -*Nextflow* provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to trouble-shoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. +_Description_: +_Nextflow_ provides excellent functionality for generating various reports relevant to the running and execution of the pipeline. This will allow you to trouble-shoot errors with the running of the pipeline, and also provide you with other information such as launch commands, run times and resource usage. diff --git a/docs/usage.md b/docs/usage.md index 732277c7..ab3596c1 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,25 +8,25 @@ You will need to create a file with information about the samples in your experiment/run before executing the pipeline. Use the `--input` parameter to specify its location. It has to be a comma-separated file with 6 columns and a header row: -| Column | Description | -|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `group` | Group identifier for sample. This will be identical for replicate samples from the same experimental group. | -| `replicate` | Integer representing replicate number. Must start from `1..`. | -| `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | -| `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam" | -| `genome` | Genome fasta file for alignment. This can either be blank, a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | -| `transcriptome` | Transcriptome fasta/gtf file for alignment. This can either be blank or a local path. Must have the extension ".fasta", ".fasta.gz", ".fa", ".fa.gz", ".gtf" or ".gtf.gz". | +| Column | Description | +| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `group` | Group identifier for sample. This will be identical for replicate samples from the same experimental group. | +| `replicate` | Integer representing replicate number. Must start from `1..`. | +| `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | +| `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam" | +| `genome` | Genome fasta file for alignment. This can either be blank, a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | +| `transcriptome` | Transcriptome fasta/gtf file for alignment. This can either be blank or a local path. Must have the extension ".fasta", ".fasta.gz", ".fa", ".fa.gz", ".gtf" or ".gtf.gz". | ### Specifying a reference genome/transcriptome Each sample in the sample sheet can be mapped to its own reference genome or transcriptome. Please see below for additional details required to fill in the `genome` and `transcriptome` columns appropriately: -* If both `genome` and `transcriptome` are not specified then the mapping will be skipped for that sample. -* If both `genome` and `transcriptome` are specified as local fasta files then the transcriptome will be preferentially used for mapping. -* If `genome` is specified as a local fasta file and `transcriptome` is left blank then mapping will be performed relative to the genome. -* If `genome` isnt specified and `transcriptome` is provided as a fasta file then mapping will be performed relative to the transcriptome. -* If `genome` is specified as an AWS iGenomes key then the `transcriptome` column can be blank. The associated gtf file for the `transcriptome` will be automatically obtained in order to create a transcriptome fasta file. However, the reads will only be mapped to the transcriptome if `--protocol cDNA` or `--protocol directRNA`. If `--protocol DNA` then the reads will still be mapped to the genome essentially ignoring the gtf file. -* If `genome` is specified as a local fasta file and `transcriptome` is a specified as a local gtf file then both of these will be used to create a transcriptome fasta file. However, the reads will only be mapped to the transcriptome if `--protocol cDNA` or `--protocol directRNA`. If `--protocol DNA` then the reads will still be mapped to the genome essentially ignoring the gtf file. +- If both `genome` and `transcriptome` are not specified then the mapping will be skipped for that sample. +- If both `genome` and `transcriptome` are specified as local fasta files then the transcriptome will be preferentially used for mapping. +- If `genome` is specified as a local fasta file and `transcriptome` is left blank then mapping will be performed relative to the genome. +- If `genome` isnt specified and `transcriptome` is provided as a fasta file then mapping will be performed relative to the transcriptome. +- If `genome` is specified as an AWS iGenomes key then the `transcriptome` column can be blank. The associated gtf file for the `transcriptome` will be automatically obtained in order to create a transcriptome fasta file. However, the reads will only be mapped to the transcriptome if `--protocol cDNA` or `--protocol directRNA`. If `--protocol DNA` then the reads will still be mapped to the genome essentially ignoring the gtf file. +- If `genome` is specified as a local fasta file and `transcriptome` is a specified as a local gtf file then both of these will be used to create a transcriptome fasta file. However, the reads will only be mapped to the transcriptome if `--protocol cDNA` or `--protocol directRNA`. If `--protocol DNA` then the reads will still be mapped to the genome essentially ignoring the gtf file. ### Skip basecalling/demultiplexing diff --git a/modules.json b/modules.json index d3292b1c..c57e9eac 100644 --- a/modules.json +++ b/modules.json @@ -38,4 +38,4 @@ } } } -} \ No newline at end of file +} diff --git a/nextflow_schema.json b/nextflow_schema.json index a98bd285..e2d1fe18 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -10,10 +10,7 @@ "type": "object", "fa_icon": "fas fa-terminal", "description": "Define where the pipeline should find input data and save output data.", - "required": [ - "input", - "protocol" - ], + "required": ["input", "protocol"], "properties": { "input": { "type": "string", From 1ca57eb74e45d36b3f580df988b445b9f6419fb3 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Fri, 22 Apr 2022 10:39:10 +0200 Subject: [PATCH 112/169] Prettier missed files --- conf/test_nobc_nodx_vc.config | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 79fd8349..f888295f 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -8,19 +8,19 @@ */ params { - config_profile_name = 'Test profile' - config_profile_description = 'Minimal test dataset to check variant calling functions' - - // Limit resources so that this can run on Travis - max_cpus = 2 - max_memory = 6.GB - max_time = 12.h - - // Input data to skip basecalling and demultiplexing, and variant call - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_vc.csv' - protocol = 'DNA' - skip_basecalling = true - skip_quantification = true - skip_demultiplexing = true - call_variants = true + config_profile_name = 'Test profile' + config_profile_description = 'Minimal test dataset to check variant calling functions' + + // Limit resources so that this can run on Travis + max_cpus = 2 + max_memory = 6.GB + max_time = 12.h + + // Input data to skip basecalling and demultiplexing, and variant call + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_vc.csv' + protocol = 'DNA' + skip_basecalling = true + skip_quantification = true + skip_demultiplexing = true + call_variants = true } From a8b49bec069c3145f50b6deabbcc5eb88c0020ec Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Fri, 22 Apr 2022 10:41:02 +0200 Subject: [PATCH 113/169] Prettier fix two lines --- conf/test_nobc_nodx_vc.config | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index f888295f..fa34cda4 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -10,12 +10,12 @@ params { config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check variant calling functions' - + // Limit resources so that this can run on Travis max_cpus = 2 max_memory = 6.GB max_time = 12.h - + // Input data to skip basecalling and demultiplexing, and variant call input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_vc.csv' protocol = 'DNA' From 15658ca9411cd89a5ca3d84a47cec9a2300ae523 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Fri, 22 Apr 2022 13:13:48 +0200 Subject: [PATCH 114/169] Fix Issue #174 --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 135282 -> 133243 bytes docs/images/nanoseq_subwaymap_v3.0.svg | 29 +++++++++++++++++++++++-- 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png index 3e6985877fcdbf2ed76146756adfbec7ab69c79b..80f368e4e1cd0a2859d3252c57b97ee723fb3d17 100644 GIT binary patch literal 133243 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 R^B)32N5fFPO4TmnzW~6QoMiw2 literal 135282 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 >=0t%08ssTHr$eNDC2WBKcC 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ࡻlmbvfCB61+BF>U+L$T!lQ4P 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 diff --git a/docs/images/nanoseq_subwaymap_v3.0.svg b/docs/images/nanoseq_subwaymap_v3.0.svg index d0bb36e6..d129ee82 100644 --- a/docs/images/nanoseq_subwaymap_v3.0.svg +++ b/docs/images/nanoseq_subwaymap_v3.0.svg @@ -6,11 +6,36 @@ xml:space="preserve" id="svg851" version="1.1" + sodipodi:docname="nanoseq_subwaymap_v3.0.svg" + inkscape:version="1.1.1 (c3084ef, 2021-09-22)" + inkscape:export-filename="/Users/chrishakkaart/workspace/nanoseq/docs/images/nanoseq_subwaymap_v3.0.png" + inkscape:export-xdpi="96" + inkscape:export-ydpi="96" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:cc="http://creativecommons.org/ns#" - xmlns:dc="http://purl.org/dc/elements/1.1/">image/svg+xmlNanopore basecalling, demultiplexing, QC, alignment, and downstram analysis.Nanopore basecalling, demultiplexing, QC, alignment, and downstream analysis. Date: Mon, 25 Apr 2022 13:28:26 +0200 Subject: [PATCH 115/169] Fix mode error --- conf/modules.config | 8 -------- 1 file changed, 8 deletions(-) diff --git a/conf/modules.config b/conf/modules.config index e4ab67e4..2ff8a83a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -727,12 +727,4 @@ if (!params.skip_multiqc) { } } - withName: CUSTOM_DUMPSOFTWAREVERSIONS { - publishDir = [ - path: { "${params.outdir}/pipeline_info" }, - mode: params.publish_dir_mode, - pattern: '*_versions.yml' - ] - } - } From 2768d6203e5218850cd8c5642125643a37128f5a Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Mon, 25 Apr 2022 13:49:25 +0200 Subject: [PATCH 116/169] Prettier --- CHANGELOG.md | 28 ++++++++++++++-------------- README.md | 6 +++--- modules.json | 2 +- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 1a2ba42a..a85df152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -20,20 +20,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Parameters -* Added `--output_demultiplex_fast5` to output demultiplexed fast5 -* Added `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq -* Added `--call_variants` to detect DNA variants -* Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms -* Added `--phase_vcf` to output a phased vcf -* Added `--skip_vc` to skip `variant_calling` -* Added `--skip_sv` to skip `structural_variant_calling` -* Added `--variant_caller` to specify variant caller. -* Added `--structural_variant_caller` to specify structural variant caller -* Added `--skip_modification_analysis` to skip RNA modification detection -* Added `--skip_xpore` to skip `xpore` -* Added `--skip_m6anet` to skip `m6anet` -* Added `--skip_fusion_analysis` to skip RNA fusion detection -* Added `--jaffal_ref_dir` to indicate the reference directory path required by `JAFFAL` +- Added `--output_demultiplex_fast5` to output demultiplexed fast5 +- Added `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq +- Added `--call_variants` to detect DNA variants +- Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms +- Added `--phase_vcf` to output a phased vcf +- Added `--skip_vc` to skip `variant_calling` +- Added `--skip_sv` to skip `structural_variant_calling` +- Added `--variant_caller` to specify variant caller. +- Added `--structural_variant_caller` to specify structural variant caller +- Added `--skip_modification_analysis` to skip RNA modification detection +- Added `--skip_xpore` to skip `xpore` +- Added `--skip_m6anet` to skip `m6anet` +- Added `--skip_fusion_analysis` to skip RNA fusion detection +- Added `--jaffal_ref_dir` to indicate the reference directory path required by `JAFFAL` ### Software dependencies diff --git a/README.md b/README.md index 1bd18395..b058cd83 100644 --- a/README.md +++ b/README.md @@ -35,9 +35,9 @@ On release, automated continuous integration tests run the pipeline on a [full-s - Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation 7. DNA-specific downstream analysis: - * Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka), [`deepvariant`](https://github.com/google/deepvariant), or [`pepper_deepvariant`](https://github.com/kishwarshafin/pepper)) - * Structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles) or [`cutesv`](https://github.com/tjiangHIT/cuteSV)) - - DNA variant calling ([`medaka`](https://github.com/nanoporetech/medaka) and/or [`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) + - Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka), [`deepvariant`](https://github.com/google/deepvariant), or [`pepper_deepvariant`](https://github.com/kishwarshafin/pepper)) + - Structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles) or [`cutesv`](https://github.com/tjiangHIT/cuteSV)) + * DNA variant calling ([`medaka`](https://github.com/nanoporetech/medaka) and/or [`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) 8. RNA-specific downstream analysis: - Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) - bambu performs both transcript reconstruction and quantification diff --git a/modules.json b/modules.json index b519f579..ff28ac25 100644 --- a/modules.json +++ b/modules.json @@ -50,4 +50,4 @@ } } } -} \ No newline at end of file +} From 9e124277a8b28ec86b7baaf903c01faa4e7d03d1 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Mon, 25 Apr 2022 13:55:21 +0200 Subject: [PATCH 117/169] Prettier missed this? --- conf/test_nobc_nodx_vc.config | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 10727c62..9a2c29ea 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -11,19 +11,19 @@ params { config_profile_name = 'Test profile' config_profile_description = 'Minimal test dataset to check variant calling functions' - // Limit resources so that this can run on Travis - max_cpus = 2 - max_memory = 8.GB - max_time = 12.h + // Limit resources so that this can run on Travis + max_cpus = 2 + max_memory = 8.GB + max_time = 12.h - // Input data to skip basecalling and demultiplexing, and variant call - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_vc.csv' - protocol = 'DNA' - skip_basecalling = true - skip_quantification = true - skip_demultiplexing = true - call_variants = true + // Input data to skip basecalling and demultiplexing, and variant call + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_vc.csv' + protocol = 'DNA' + skip_basecalling = true + skip_quantification = true + skip_demultiplexing = true + call_variants = true - variant_caller = 'medaka' - structural_variant_caller = 'cutesv' + variant_caller = 'medaka' + structural_variant_caller = 'cutesv' } From b9c0022b6b55d04f4a01402776fce5ffbcb65e04 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Mon, 25 Apr 2022 16:07:24 +0200 Subject: [PATCH 118/169] Update check_samplesheet.py Revert to previous version --- bin/check_samplesheet.py | 203 +++++++++------------------------------ 1 file changed, 43 insertions(+), 160 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 55282299..6c0c2651 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -4,13 +4,11 @@ import sys import errno import argparse -import csv -import logging -import sys -from collections import Counter -from pathlib import Path -logger = logging.getLogger() + +def parse_args(args=None): + Description = "Reformat nf-core/nanoseq samplesheet file and check its contents." + Epilog = "Example usage: python check_samplesheet.py " parser = argparse.ArgumentParser(description=Description, epilog=Epilog) parser.add_argument("FILE_IN", help="Input samplesheet file.") @@ -18,152 +16,35 @@ parser.add_argument("FILE_OUT", help="Output file.") return parser.parse_args(args) -class RowChecker: - """ - Define a service that can validate and transform each given row. - - Attributes: - modified (list): A list of dicts, where each dict corresponds to a previously - validated and transformed row. The order of rows is maintained. - - """ - - VALID_FORMATS = ( - ".fq.gz", - ".fastq.gz", - ) - - def __init__( - self, - sample_col="sample", - first_col="fastq_1", - second_col="fastq_2", - single_col="single_end", - **kwargs, - ): - """ - Initialize the row checker with the expected column names. - - Args: - sample_col (str): The name of the column that contains the sample name - (default "sample"). - first_col (str): The name of the column that contains the first (or only) - FASTQ file path (default "fastq_1"). - second_col (str): The name of the column that contains the second (if any) - FASTQ file path (default "fastq_2"). - single_col (str): The name of the new column that will be inserted and - records whether the sample contains single- or paired-end sequencing - reads (default "single_end"). - - """ - super().__init__(**kwargs) - self._sample_col = sample_col - self._first_col = first_col - self._second_col = second_col - self._single_col = single_col - self._seen = set() - self.modified = [] - - def validate_and_transform(self, row): - """ - Perform all validations on the given row and insert the read pairing status. - - Args: - row (dict): A mapping from column headers (keys) to elements of that row - (values). - - """ - self._validate_sample(row) - self._validate_first(row) - self._validate_second(row) - self._validate_pair(row) - self._seen.add((row[self._sample_col], row[self._first_col])) - self.modified.append(row) - def _validate_sample(self, row): - """Assert that the sample name exists and convert spaces to underscores.""" - assert len(row[self._sample_col]) > 0, "Sample input is required." - # Sanitize samples slightly. - row[self._sample_col] = row[self._sample_col].replace(" ", "_") +def make_dir(path): + if len(path) > 0: + try: + os.makedirs(path) + except OSError as exception: + if exception.errno != errno.EEXIST: + raise exception - def _validate_first(self, row): - """Assert that the first FASTQ entry is non-empty and has the right format.""" - assert len(row[self._first_col]) > 0, "At least the first FASTQ file is required." - self._validate_fastq_format(row[self._first_col]) - def _validate_second(self, row): - """Assert that the second FASTQ entry has the right format if it exists.""" - if len(row[self._second_col]) > 0: - self._validate_fastq_format(row[self._second_col]) - - def _validate_pair(self, row): - """Assert that read pairs have the same file extension. Report pair status.""" - if row[self._first_col] and row[self._second_col]: - row[self._single_col] = False - assert ( - Path(row[self._first_col]).suffixes == Path(row[self._second_col]).suffixes - ), "FASTQ pairs must have the same file extensions." - else: - row[self._single_col] = True - - def _validate_fastq_format(self, filename): - """Assert that a given filename has one of the expected FASTQ extensions.""" - assert any(filename.endswith(extension) for extension in self.VALID_FORMATS), ( - f"The FASTQ file has an unrecognized extension: {filename}\n" - f"It should be one of: {', '.join(self.VALID_FORMATS)}" +def print_error(error, context="Line", context_str=""): + error_str = "ERROR: Please check samplesheet -> {}".format(error) + if context != "" and context_str != "": + error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format( + error, context.strip(), context_str.strip() ) + print(error_str) + sys.exit(1) - def validate_unique_samples(self): - """ - Assert that the combination of sample name and FASTQ filename is unique. - - In addition to the validation, also rename the sample if more than one sample, - FASTQ file combination exists. - - """ - assert len(self._seen) == len(self.modified), "The pair of sample name and FASTQ must be unique." - if len({pair[0] for pair in self._seen}) < len(self._seen): - counts = Counter(pair[0] for pair in self._seen) - seen = Counter() - for row in self.modified: - sample = row[self._sample_col] - seen[sample] += 1 - if counts[sample] > 1: - row[self._sample_col] = f"{sample}_T{seen[sample]}" - - -def sniff_format(handle): - """ - Detect the tabular format. - - Args: - handle (text file): A handle to a `text file`_ object. The read position is - expected to be at the beginning (index 0). - - Returns: - csv.Dialect: The detected tabular format. - - .. _text file: - https://docs.python.org/3/glossary.html#term-text-file def check_samplesheet(file_in, updated_path, file_out): """ - peek = handle.read(2048) - sniffer = csv.Sniffer() - if not sniffer.has_header(peek): - logger.critical(f"The given sample sheet does not appear to contain a header.") - sys.exit(1) - dialect = sniffer.sniff(peek) - handle.seek(0) - return dialect - - group,replicate,barcode,input_file,genome,transcriptome + This function checks that the samplesheet follows the following structure: + group,replicate,barcode,input_file,fasta,gtf MCF7,1,,MCF7_directcDNA_replicate1.fastq.gz,genome.fa, MCF7,2,,MCF7_directcDNA_replicate3.fastq.gz,genome.fa,genome.gtf K562,1,,K562_directcDNA_replicate1.fastq.gz,genome.fa, K562,2,,K562_directcDNA_replicate4.fastq.gz,,transcripts.fa """ - Check that the tabular samplesheet has the structure expected by nf-core pipelines. input_extensions = [] sample_info_dict = {} @@ -171,7 +52,7 @@ def check_samplesheet(file_in, updated_path, file_out): ## Check header MIN_COLS = 3 - HEADER = ['group', 'replicate', 'barcode', 'input_file', 'genome', 'transcriptome'] + HEADER = ['group', 'replicate', 'barcode', 'input_file', 'fasta', 'gtf'] header = fin.readline().strip().split(",") if header[:len(HEADER)] != HEADER: print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) @@ -190,7 +71,7 @@ def check_samplesheet(file_in, updated_path, file_out): print_error("Invalid number of populated columns (minimum = {})!".format(MIN_COLS), 'Line', line) ## Check group name entries - group, replicate, barcode, input_file, genome, transcriptome = lspl[:len(HEADER)] + group, replicate, barcode, input_file, fasta, gtf = lspl[:len(HEADER)] if group: if group.find(" ") != -1: print_error("Group entry contains spaces!", 'Line', line) @@ -237,7 +118,6 @@ def check_samplesheet(file_in, updated_path, file_out): ## CHECK PROVIDED BASECALLED FASTQ fastq_path = input_file+'/fastq' basecalled_fastq = [fn for fn in os.listdir(fastq_path) if fn.endswith(".fastq.gz") or fn.endswith(".fq.gz") ] - print(basecalled_fastq) if len(basecalled_fastq) != 1: print_error('Please input one basecalled fastq per sample.') else: @@ -249,31 +129,34 @@ def check_samplesheet(file_in, updated_path, file_out): print_error('path does not end with ".fastq.gz", ".fq.gz", or ".bam" and is not an existing directory with correct fast5 and/or fastq inputs.') ## Check genome entries - if genome: - if genome.find(' ') != -1: + if fasta: + if fasta.find(' ') != -1: print_error("Genome entry contains spaces!",'Line', line) - if len(genome.split('.')) > 1: - if genome[-6:] != '.fasta' and genome[-3:] != '.fa' and genome[-9:] != '.fasta.gz' and genome[-6:] != '.fa.gz': + if len(fasta.split('.')) > 1: + if fasta[-6:] != '.fasta' and fasta[-3:] != '.fa' and fasta[-9:] != '.fasta.gz' and fasta[-6:] != '.fa.gz': print_error("Genome entry does not have extension '.fasta', '.fa', '.fasta.gz' or '.fa.gz'!",'Line', line) ## Check transcriptome entries - gtf = '' + #gtf = '' is_transcripts = '0' - if transcriptome: - if transcriptome.find(' ') != -1: + if gtf: + if gtf.find(' ') != -1: print_error("Transcriptome entry contains spaces!",'Line',line) - if transcriptome[-6:] != '.fasta' and transcriptome[-3:] != '.fa' and transcriptome[-9:] != '.fasta.gz' and transcriptome[-6:] != '.fa.gz' and transcriptome[-4:] != '.gtf' and transcriptome[-7:] != '.gtf.gz': - print_error("Transcriptome entry does not have extension '.fasta', '.fa', '.fasta.gz', '.fa.gz', '.gtf' or '.gtf.gz'!", 'Line', line) - if transcriptome[-4:] == '.gtf' or transcriptome[-7:] == '.gtf.gz': - gtf = transcriptome - if not genome: - print_error("If genome isn't provided, transcriptome must be in fasta format for mapping!", 'Line', line) - else: - is_transcripts = '1' - genome = transcriptome + print(gtf[-4:]) + if gtf[-4:] != '.gtf' and gtf[-7:] != '.gtf.gz': + print_error("Transcriptome entry does not have extension '.gtf' or '.gtf.gz'!", 'Line', line) + #if transcriptome[-6:] != '.fasta' and transcriptome[-3:] != '.fa' and transcriptome[-9:] != '.fasta.gz' and transcriptome[-6:] != '.fa.gz' and transcriptome[-4:] != '.gtf' and transcriptome[-7:] != '.gtf.gz': + # print_error("Transcriptome entry does not have extension '.fasta', '.fa', '.fasta.gz', '.fa.gz', '.gtf' or '.gtf.gz'!", 'Line', line) + #if transcriptome[-4:] == '.gtf' or transcriptome[-7:] == '.gtf.gz': + # gtf = transcriptome + # if not genome: + # print_error("If genome isn't provided, transcriptome must be in fasta format for mapping!", 'Line', line) + #else: + # is_transcripts = '1' + # genome = transcriptome ## Create sample mapping dictionary = {group: {replicate : [ barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5 ]}} - sample_info = [barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5] + sample_info = [barcode, input_file, fasta, gtf, is_transcripts, nanopolish_fast5] if group not in sample_info_dict: sample_info_dict[group] = {} if replicate not in sample_info_dict[group]: @@ -291,7 +174,7 @@ def check_samplesheet(file_in, updated_path, file_out): make_dir(out_dir) with open(file_out, "w") as fout: - fout.write(",".join(['sample', 'barcode', 'input_file', 'genome', 'gtf', 'is_transcripts', 'nanopolish_fast5']) + "\n") + fout.write(",".join(['sample', 'barcode', 'input_file', 'fasta', 'gtf', 'is_transcripts', 'nanopolish_fast5']) + "\n") for sample in sorted(sample_info_dict.keys()): ## Check that replicate ids are in format 1.. From 91e21cdbca45f879e5725cd8d4c209e4db47148d Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Mon, 25 Apr 2022 16:14:34 +0200 Subject: [PATCH 119/169] Update test_nobc_nodx_vc.config Update samplesheet --- conf/test_nobc_nodx_vc.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 9a2c29ea..9f74a5bf 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -17,7 +17,7 @@ params { max_time = 12.h // Input data to skip basecalling and demultiplexing, and variant call - input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/samplesheet_nobc_nodx_vc.csv' + input = 'https://raw.githubusercontent.com/nf-core/test-datasets/nanoseq/3.0/samplesheet/samplesheet_nobc_nodx_vc.csv' protocol = 'DNA' skip_basecalling = true skip_quantification = true From bd9fdc131e156ae913451caa7cdd885837a84e20 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Mon, 25 Apr 2022 19:48:38 +0200 Subject: [PATCH 120/169] revert samplesheet.py --- bin/check_samplesheet.py | 46 +++++++++++++++++++--------------------- workflows/nanoseq.nf | 1 + 2 files changed, 23 insertions(+), 24 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 6c0c2651..53546291 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -39,7 +39,7 @@ def print_error(error, context="Line", context_str=""): def check_samplesheet(file_in, updated_path, file_out): """ This function checks that the samplesheet follows the following structure: - group,replicate,barcode,input_file,fasta,gtf + group,replicate,barcode,input_file,genome,transcriptome MCF7,1,,MCF7_directcDNA_replicate1.fastq.gz,genome.fa, MCF7,2,,MCF7_directcDNA_replicate3.fastq.gz,genome.fa,genome.gtf K562,1,,K562_directcDNA_replicate1.fastq.gz,genome.fa, @@ -52,7 +52,7 @@ def check_samplesheet(file_in, updated_path, file_out): ## Check header MIN_COLS = 3 - HEADER = ['group', 'replicate', 'barcode', 'input_file', 'fasta', 'gtf'] + HEADER = ['group', 'replicate', 'barcode', 'input_file', 'genome', 'transcriptome'] header = fin.readline().strip().split(",") if header[:len(HEADER)] != HEADER: print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) @@ -71,7 +71,7 @@ def check_samplesheet(file_in, updated_path, file_out): print_error("Invalid number of populated columns (minimum = {})!".format(MIN_COLS), 'Line', line) ## Check group name entries - group, replicate, barcode, input_file, fasta, gtf = lspl[:len(HEADER)] + group, replicate, barcode, input_file, genome, transcriptome = lspl[:len(HEADER)] if group: if group.find(" ") != -1: print_error("Group entry contains spaces!", 'Line', line) @@ -118,6 +118,7 @@ def check_samplesheet(file_in, updated_path, file_out): ## CHECK PROVIDED BASECALLED FASTQ fastq_path = input_file+'/fastq' basecalled_fastq = [fn for fn in os.listdir(fastq_path) if fn.endswith(".fastq.gz") or fn.endswith(".fq.gz") ] + print(basecalled_fastq) if len(basecalled_fastq) != 1: print_error('Please input one basecalled fastq per sample.') else: @@ -129,34 +130,31 @@ def check_samplesheet(file_in, updated_path, file_out): print_error('path does not end with ".fastq.gz", ".fq.gz", or ".bam" and is not an existing directory with correct fast5 and/or fastq inputs.') ## Check genome entries - if fasta: - if fasta.find(' ') != -1: + if genome: + if genome.find(' ') != -1: print_error("Genome entry contains spaces!",'Line', line) - if len(fasta.split('.')) > 1: - if fasta[-6:] != '.fasta' and fasta[-3:] != '.fa' and fasta[-9:] != '.fasta.gz' and fasta[-6:] != '.fa.gz': + if len(genome.split('.')) > 1: + if genome[-6:] != '.fasta' and genome[-3:] != '.fa' and genome[-9:] != '.fasta.gz' and genome[-6:] != '.fa.gz': print_error("Genome entry does not have extension '.fasta', '.fa', '.fasta.gz' or '.fa.gz'!",'Line', line) ## Check transcriptome entries - #gtf = '' + gtf = '' is_transcripts = '0' - if gtf: - if gtf.find(' ') != -1: + if transcriptome: + if transcriptome.find(' ') != -1: print_error("Transcriptome entry contains spaces!",'Line',line) - print(gtf[-4:]) - if gtf[-4:] != '.gtf' and gtf[-7:] != '.gtf.gz': - print_error("Transcriptome entry does not have extension '.gtf' or '.gtf.gz'!", 'Line', line) - #if transcriptome[-6:] != '.fasta' and transcriptome[-3:] != '.fa' and transcriptome[-9:] != '.fasta.gz' and transcriptome[-6:] != '.fa.gz' and transcriptome[-4:] != '.gtf' and transcriptome[-7:] != '.gtf.gz': - # print_error("Transcriptome entry does not have extension '.fasta', '.fa', '.fasta.gz', '.fa.gz', '.gtf' or '.gtf.gz'!", 'Line', line) - #if transcriptome[-4:] == '.gtf' or transcriptome[-7:] == '.gtf.gz': - # gtf = transcriptome - # if not genome: - # print_error("If genome isn't provided, transcriptome must be in fasta format for mapping!", 'Line', line) - #else: - # is_transcripts = '1' - # genome = transcriptome + if transcriptome[-6:] != '.fasta' and transcriptome[-3:] != '.fa' and transcriptome[-9:] != '.fasta.gz' and transcriptome[-6:] != '.fa.gz' and transcriptome[-4:] != '.gtf' and transcriptome[-7:] != '.gtf.gz': + print_error("Transcriptome entry does not have extension '.fasta', '.fa', '.fasta.gz', '.fa.gz', '.gtf' or '.gtf.gz'!", 'Line', line) + if transcriptome[-4:] == '.gtf' or transcriptome[-7:] == '.gtf.gz': + gtf = transcriptome + if not genome: + print_error("If genome isn't provided, transcriptome must be in fasta format for mapping!", 'Line', line) + else: + is_transcripts = '1' + genome = transcriptome ## Create sample mapping dictionary = {group: {replicate : [ barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5 ]}} - sample_info = [barcode, input_file, fasta, gtf, is_transcripts, nanopolish_fast5] + sample_info = [barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5] if group not in sample_info_dict: sample_info_dict[group] = {} if replicate not in sample_info_dict[group]: @@ -174,7 +172,7 @@ def check_samplesheet(file_in, updated_path, file_out): make_dir(out_dir) with open(file_out, "w") as fout: - fout.write(",".join(['sample', 'barcode', 'input_file', 'fasta', 'gtf', 'is_transcripts', 'nanopolish_fast5']) + "\n") + fout.write(",".join(['sample', 'barcode', 'input_file', 'genome', 'gtf', 'is_transcripts', 'nanopolish_fast5']) + "\n") for sample in sorted(sample_info_dict.keys()): ## Check that replicate ids are in format 1.. diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 29757398..e17cd49e 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -319,6 +319,7 @@ workflow NANOSEQ{ /* * SUBWORKFLOW: Make chromosome size file and covert GTF to BED12 */ + ch_fastq.view() PREPARE_GENOME ( ch_fastq ) ch_fasta_index = PREPARE_GENOME.out.ch_fasta_index ch_gtf_bed = PREPARE_GENOME.out.ch_gtf_bed From 887e8de7c560c511c1da016f33fdc00039da3053 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Tue, 26 Apr 2022 12:24:25 +0200 Subject: [PATCH 121/169] Move to local samtools modules --- bin/check_samplesheet.py | 46 ++++++++++--------- conf/test_nobc_nodx_vc.config | 2 +- modules.json | 5 +- .../faidx/main.nf => local/samtools_faidx.nf} | 3 +- modules/local/samtools_flagstat.nf | 26 +++++++++++ modules/local/samtools_idxstats.nf | 26 +++++++++++ modules/local/samtools_index.nf | 28 +++++++++++ modules/local/samtools_sort.nf | 27 +++++++++++ modules/local/samtools_sort_index.nf | 1 - modules/local/samtools_stats.nf | 28 +++++++++++ .../nf-core/modules/samtools/faidx/meta.yml | 43 ----------------- subworkflows/local/bam_sort_index_samtools.nf | 4 +- .../{nf-core => local}/bam_stats_samtools.nf | 4 +- subworkflows/local/input_check.nf | 10 ++-- subworkflows/local/prepare_genome.nf | 2 +- 15 files changed, 173 insertions(+), 82 deletions(-) rename modules/{nf-core/modules/samtools/faidx/main.nf => local/samtools_faidx.nf} (99%) create mode 100644 modules/local/samtools_flagstat.nf create mode 100644 modules/local/samtools_idxstats.nf create mode 100644 modules/local/samtools_index.nf create mode 100644 modules/local/samtools_sort.nf create mode 100644 modules/local/samtools_stats.nf delete mode 100644 modules/nf-core/modules/samtools/faidx/meta.yml rename subworkflows/{nf-core => local}/bam_stats_samtools.nf (85%) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 53546291..6c0c2651 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -39,7 +39,7 @@ def print_error(error, context="Line", context_str=""): def check_samplesheet(file_in, updated_path, file_out): """ This function checks that the samplesheet follows the following structure: - group,replicate,barcode,input_file,genome,transcriptome + group,replicate,barcode,input_file,fasta,gtf MCF7,1,,MCF7_directcDNA_replicate1.fastq.gz,genome.fa, MCF7,2,,MCF7_directcDNA_replicate3.fastq.gz,genome.fa,genome.gtf K562,1,,K562_directcDNA_replicate1.fastq.gz,genome.fa, @@ -52,7 +52,7 @@ def check_samplesheet(file_in, updated_path, file_out): ## Check header MIN_COLS = 3 - HEADER = ['group', 'replicate', 'barcode', 'input_file', 'genome', 'transcriptome'] + HEADER = ['group', 'replicate', 'barcode', 'input_file', 'fasta', 'gtf'] header = fin.readline().strip().split(",") if header[:len(HEADER)] != HEADER: print("ERROR: Please check samplesheet header -> {} != {}".format(",".join(header), ",".join(HEADER))) @@ -71,7 +71,7 @@ def check_samplesheet(file_in, updated_path, file_out): print_error("Invalid number of populated columns (minimum = {})!".format(MIN_COLS), 'Line', line) ## Check group name entries - group, replicate, barcode, input_file, genome, transcriptome = lspl[:len(HEADER)] + group, replicate, barcode, input_file, fasta, gtf = lspl[:len(HEADER)] if group: if group.find(" ") != -1: print_error("Group entry contains spaces!", 'Line', line) @@ -118,7 +118,6 @@ def check_samplesheet(file_in, updated_path, file_out): ## CHECK PROVIDED BASECALLED FASTQ fastq_path = input_file+'/fastq' basecalled_fastq = [fn for fn in os.listdir(fastq_path) if fn.endswith(".fastq.gz") or fn.endswith(".fq.gz") ] - print(basecalled_fastq) if len(basecalled_fastq) != 1: print_error('Please input one basecalled fastq per sample.') else: @@ -130,31 +129,34 @@ def check_samplesheet(file_in, updated_path, file_out): print_error('path does not end with ".fastq.gz", ".fq.gz", or ".bam" and is not an existing directory with correct fast5 and/or fastq inputs.') ## Check genome entries - if genome: - if genome.find(' ') != -1: + if fasta: + if fasta.find(' ') != -1: print_error("Genome entry contains spaces!",'Line', line) - if len(genome.split('.')) > 1: - if genome[-6:] != '.fasta' and genome[-3:] != '.fa' and genome[-9:] != '.fasta.gz' and genome[-6:] != '.fa.gz': + if len(fasta.split('.')) > 1: + if fasta[-6:] != '.fasta' and fasta[-3:] != '.fa' and fasta[-9:] != '.fasta.gz' and fasta[-6:] != '.fa.gz': print_error("Genome entry does not have extension '.fasta', '.fa', '.fasta.gz' or '.fa.gz'!",'Line', line) ## Check transcriptome entries - gtf = '' + #gtf = '' is_transcripts = '0' - if transcriptome: - if transcriptome.find(' ') != -1: + if gtf: + if gtf.find(' ') != -1: print_error("Transcriptome entry contains spaces!",'Line',line) - if transcriptome[-6:] != '.fasta' and transcriptome[-3:] != '.fa' and transcriptome[-9:] != '.fasta.gz' and transcriptome[-6:] != '.fa.gz' and transcriptome[-4:] != '.gtf' and transcriptome[-7:] != '.gtf.gz': - print_error("Transcriptome entry does not have extension '.fasta', '.fa', '.fasta.gz', '.fa.gz', '.gtf' or '.gtf.gz'!", 'Line', line) - if transcriptome[-4:] == '.gtf' or transcriptome[-7:] == '.gtf.gz': - gtf = transcriptome - if not genome: - print_error("If genome isn't provided, transcriptome must be in fasta format for mapping!", 'Line', line) - else: - is_transcripts = '1' - genome = transcriptome + print(gtf[-4:]) + if gtf[-4:] != '.gtf' and gtf[-7:] != '.gtf.gz': + print_error("Transcriptome entry does not have extension '.gtf' or '.gtf.gz'!", 'Line', line) + #if transcriptome[-6:] != '.fasta' and transcriptome[-3:] != '.fa' and transcriptome[-9:] != '.fasta.gz' and transcriptome[-6:] != '.fa.gz' and transcriptome[-4:] != '.gtf' and transcriptome[-7:] != '.gtf.gz': + # print_error("Transcriptome entry does not have extension '.fasta', '.fa', '.fasta.gz', '.fa.gz', '.gtf' or '.gtf.gz'!", 'Line', line) + #if transcriptome[-4:] == '.gtf' or transcriptome[-7:] == '.gtf.gz': + # gtf = transcriptome + # if not genome: + # print_error("If genome isn't provided, transcriptome must be in fasta format for mapping!", 'Line', line) + #else: + # is_transcripts = '1' + # genome = transcriptome ## Create sample mapping dictionary = {group: {replicate : [ barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5 ]}} - sample_info = [barcode, input_file, genome, gtf, is_transcripts, nanopolish_fast5] + sample_info = [barcode, input_file, fasta, gtf, is_transcripts, nanopolish_fast5] if group not in sample_info_dict: sample_info_dict[group] = {} if replicate not in sample_info_dict[group]: @@ -172,7 +174,7 @@ def check_samplesheet(file_in, updated_path, file_out): make_dir(out_dir) with open(file_out, "w") as fout: - fout.write(",".join(['sample', 'barcode', 'input_file', 'genome', 'gtf', 'is_transcripts', 'nanopolish_fast5']) + "\n") + fout.write(",".join(['sample', 'barcode', 'input_file', 'fasta', 'gtf', 'is_transcripts', 'nanopolish_fast5']) + "\n") for sample in sorted(sample_info_dict.keys()): ## Check that replicate ids are in format 1.. diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 9f74a5bf..07b3b98d 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -24,6 +24,6 @@ params { skip_demultiplexing = true call_variants = true - variant_caller = 'medaka' + variant_caller = 'deepvariant' structural_variant_caller = 'cutesv' } diff --git a/modules.json b/modules.json index ff28ac25..985a32b7 100644 --- a/modules.json +++ b/modules.json @@ -15,9 +15,6 @@ "pycoqc": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, - "samtools/faidx": { - "git_sha": "1ad73f1b2abdea9398680d6d20014838135c9a35" - }, "samtools/flagstat": { "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, @@ -50,4 +47,4 @@ } } } -} +} \ No newline at end of file diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/local/samtools_faidx.nf similarity index 99% rename from modules/nf-core/modules/samtools/faidx/main.nf rename to modules/local/samtools_faidx.nf index 7732a4ec..5850cb03 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/local/samtools_faidx.nf @@ -1,3 +1,5 @@ + + process SAMTOOLS_FAIDX { tag "$fasta" label 'process_low' @@ -23,7 +25,6 @@ process SAMTOOLS_FAIDX { samtools \\ faidx \\ $fasta - cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/modules/local/samtools_flagstat.nf b/modules/local/samtools_flagstat.nf new file mode 100644 index 00000000..03721d0b --- /dev/null +++ b/modules/local/samtools_flagstat.nf @@ -0,0 +1,26 @@ +process SAMTOOLS_FLAGSTAT { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("*.flagstat"), emit: flagstat + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + """ + samtools flagstat --threads ${task.cpus-1} $bam > ${bam}.flagstat + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/samtools_idxstats.nf b/modules/local/samtools_idxstats.nf new file mode 100644 index 00000000..cd068679 --- /dev/null +++ b/modules/local/samtools_idxstats.nf @@ -0,0 +1,26 @@ +process SAMTOOLS_IDXSTATS { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + + input: + tuple val(meta), path(bam), path(bai) + + output: + tuple val(meta), path("*.idxstats"), emit: idxstats + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + """ + samtools idxstats $bam > ${bam}.idxstats + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/samtools_index.nf b/modules/local/samtools_index.nf new file mode 100644 index 00000000..5ef71375 --- /dev/null +++ b/modules/local/samtools_index.nf @@ -0,0 +1,28 @@ +process SAMTOOLS_INDEX { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + + input: + tuple val(meta), path(input) + + output: + tuple val(meta), path("*.bai") , optional:true, emit: bai + tuple val(meta), path("*.csi") , optional:true, emit: csi + tuple val(meta), path("*.crai"), optional:true, emit: crai + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + """ + samtools index -@ ${task.cpus-1} $args $input + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/samtools_sort.nf b/modules/local/samtools_sort.nf new file mode 100644 index 00000000..6465e000 --- /dev/null +++ b/modules/local/samtools_sort.nf @@ -0,0 +1,27 @@ +process SAMTOOLS_SORT { + tag "$meta.id" + label 'process_medium' + + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + + input: + tuple val(meta), path(bam) + + output: + tuple val(meta), path("*.bam"), emit: bam + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + samtools sort $args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/local/samtools_sort_index.nf b/modules/local/samtools_sort_index.nf index 619f0158..7cc050a0 100644 --- a/modules/local/samtools_sort_index.nf +++ b/modules/local/samtools_sort_index.nf @@ -27,4 +27,3 @@ process SAMTOOLS_SORT_INDEX { END_VERSIONS """ } - diff --git a/modules/local/samtools_stats.nf b/modules/local/samtools_stats.nf new file mode 100644 index 00000000..229f1b6a --- /dev/null +++ b/modules/local/samtools_stats.nf @@ -0,0 +1,28 @@ +process SAMTOOLS_STATS { + tag "$meta.id" + label 'process_low' + + conda (params.enable_conda ? "bioconda::samtools=1.14" : null) + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : + 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + + input: + tuple val(meta), path(input), path(input_index) + //path fasta + + output: + tuple val(meta), path("*.stats"), emit: stats + path "versions.yml" , emit: versions + + script: + def args = task.ext.args ?: '' + //def reference = fasta ? "--reference ${fasta}" : "" + """ + samtools stats --threads ${task.cpus-1} ${input} > ${input}.stats + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ +} diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml deleted file mode 100644 index e9767764..00000000 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ /dev/null @@ -1,43 +0,0 @@ -name: samtools_faidx -description: Index FASTA file -keywords: - - index - - fasta -tools: - - samtools: - description: | - SAMtools is a set of utilities for interacting with and post-processing - short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. - These files are generated as output by short read aligners like BWA. - homepage: http://www.htslib.org/ - documentation: http://www.htslib.org/doc/samtools.html - doi: 10.1093/bioinformatics/btp352 - licence: ["MIT"] -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fasta: - type: file - description: FASTA file - pattern: "*.{fa,fasta}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - fai: - type: file - description: FASTA index file - pattern: "*.{fai}" - - versions: - type: file - description: File containing software versions - pattern: "versions.yml" -authors: - - "@drpatelh" - - "@ewels" - - "@phue" diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index 0ce5fe47..5310229b 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -3,10 +3,10 @@ */ include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' -include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' +include { SAMTOOLS_SORT } from '../../modules/local/samtools_sort' include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' include { SAMTOOLS_SORT_INDEX } from '../../modules/local/samtools_sort_index' -include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' +include { BAM_STATS_SAMTOOLS } from '../../subworkflows/local/bam_stats_samtools' workflow BAM_SORT_INDEX_SAMTOOLS { take: diff --git a/subworkflows/nf-core/bam_stats_samtools.nf b/subworkflows/local/bam_stats_samtools.nf similarity index 85% rename from subworkflows/nf-core/bam_stats_samtools.nf rename to subworkflows/local/bam_stats_samtools.nf index ec45ee08..97a03b6f 100644 --- a/subworkflows/nf-core/bam_stats_samtools.nf +++ b/subworkflows/local/bam_stats_samtools.nf @@ -2,7 +2,7 @@ * Run SAMtools stats, flagstat and idxstats */ -include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' +include { SAMTOOLS_STATS } from '../../modules/local/samtools_stats' include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' @@ -11,7 +11,7 @@ workflow BAM_STATS_SAMTOOLS { ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] main: - SAMTOOLS_STATS ( ch_bam_bai, false ) + SAMTOOLS_STATS ( ch_bam_bai ) SAMTOOLS_FLAGSTAT ( ch_bam_bai ) SAMTOOLS_IDXSTATS ( ch_bam_bai ) diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index d61efb99..0d580445 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -30,12 +30,12 @@ def get_sample_info(LinkedHashMap sample, LinkedHashMap genomeMap) { // Resolve fasta and gtf file if using iGenomes def fasta = false def gtf = false - if (sample.genome) { - if (genomeMap && genomeMap.containsKey(sample.genome)) { - fasta = file(genomeMap[sample.genome].fasta, checkIfExists: true) - gtf = file(genomeMap[sample.genome].gtf, checkIfExists: true) + if (sample.fasta) { + if (genomeMap && genomeMap.containsKey(sample.fasta)) { + fasta = file(genomeMap[sample.fasta].fasta, checkIfExists: true) + gtf = file(genomeMap[sample.fasta].gtf, checkIfExists: true) } else { - fasta = file(sample.genome, checkIfExists: true) + fasta = file(sample.fasta, checkIfExists: true) } } diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index 04a8b1e7..a88ab3ec 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -4,7 +4,7 @@ include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { GTF2BED } from '../../modules/local/gtf2bed' -include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' +include { SAMTOOLS_FAIDX } from '../../modules/local/samtools_faidx' workflow PREPARE_GENOME { take: From 0ad24cb95932e71ecd535b6eb0ae0c56d5e199cb Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 27 Apr 2022 09:21:08 +0200 Subject: [PATCH 122/169] fix bugs nanoplot png outputs and skip_xpore #167 --- modules/local/nanoplot.nf | 2 +- subworkflows/local/qcbasecall_pycoqc_nanoplot.nf | 2 +- subworkflows/local/qcfastq_nanoplot_fastqc.nf | 2 +- subworkflows/local/rna_modifications_xpore_m6anet.nf | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules/local/nanoplot.nf b/modules/local/nanoplot.nf index 6172371b..448f1d18 100644 --- a/modules/local/nanoplot.nf +++ b/modules/local/nanoplot.nf @@ -12,7 +12,7 @@ process NANOPLOT { output: tuple val(meta), path("$output_html"), emit: html - tuple val(meta), path("$output_png") , emit: png + //tuple val(meta), path("$output_png") , emit: png tuple val(meta), path("$output_txt") , emit: txt tuple val(meta), path("$output_log") , emit: log path "versions.yml" , emit: versions diff --git a/subworkflows/local/qcbasecall_pycoqc_nanoplot.nf b/subworkflows/local/qcbasecall_pycoqc_nanoplot.nf index 397a8572..53d76c2e 100644 --- a/subworkflows/local/qcbasecall_pycoqc_nanoplot.nf +++ b/subworkflows/local/qcbasecall_pycoqc_nanoplot.nf @@ -37,7 +37,7 @@ workflow QCBASECALL_PYCOQC_NANOPLOT { nanoplot_log = Channel.empty() if (!skip_nanoplot){ NANOPLOT ( ch_guppy_summary_txt ) - nanoplot_png = NANOPLOT.out.png + //nanoplot_png = NANOPLOT.out.png nanoplot_html = NANOPLOT.out.html nanoplot_txt = NANOPLOT.out.txt nanoplot_log = NANOPLOT.out.log diff --git a/subworkflows/local/qcfastq_nanoplot_fastqc.nf b/subworkflows/local/qcfastq_nanoplot_fastqc.nf index a719abf9..2c53f14d 100644 --- a/subworkflows/local/qcfastq_nanoplot_fastqc.nf +++ b/subworkflows/local/qcfastq_nanoplot_fastqc.nf @@ -26,7 +26,7 @@ workflow QCFASTQ_NANOPLOT_FASTQC { nanoplot_version = Channel.empty() if (!skip_nanoplot){ NANOPLOT ( ch_fastq ) - nanoplot_png = NANOPLOT.out.png + //nanoplot_png = NANOPLOT.out.png nanoplot_html = NANOPLOT.out.html nanoplot_txt = NANOPLOT.out.txt nanoplot_log = NANOPLOT.out.log diff --git a/subworkflows/local/rna_modifications_xpore_m6anet.nf b/subworkflows/local/rna_modifications_xpore_m6anet.nf index a0f1b777..6140d92d 100644 --- a/subworkflows/local/rna_modifications_xpore_m6anet.nf +++ b/subworkflows/local/rna_modifications_xpore_m6anet.nf @@ -28,6 +28,7 @@ workflow RNA_MODIFICATION_XPORE_M6ANET { nanopolish_version = NANOPOLISH_INDEX_EVENTALIGN.out.versions xpore_version = '' + ch_xpore_dataprep_dirs = '' if (!params.skip_xpore) { XPORE_DATAPREP( ch_nanopolish_outputs ) ch_xpore_dataprep_dirs = XPORE_DATAPREP.out.dataprep_outputs From a4cb30524b23834885f4d7d3b513e37afbf05535 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 27 Apr 2022 10:46:56 +0200 Subject: [PATCH 123/169] General tidy of lines and comments --- subworkflows/local/bam_sort_index_samtools.nf | 6 + subworkflows/local/bam_stats_samtools.nf | 11 ++ subworkflows/local/bedtools_ucsc_bigwig.nf | 1 - subworkflows/local/dna_variant_calling.nf | 60 ---------- subworkflows/local/input_check.nf | 3 + subworkflows/local/rna_fusions_jaffal.nf | 12 +- .../local/rna_modifications_xpore_m6anet.nf | 6 +- subworkflows/local/short_variant_calling.nf | 53 +++++---- .../local/structural_variant_calling.nf | 54 +++++---- workflows/nanoseq.nf | 103 ++++++++++-------- 10 files changed, 157 insertions(+), 152 deletions(-) delete mode 100644 subworkflows/local/dna_variant_calling.nf diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index 5310229b..d49020a7 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -14,6 +14,9 @@ workflow BAM_SORT_INDEX_SAMTOOLS { call_variants main: + /* + * Sam to bam conversion + */ SAMTOOLS_VIEW_BAM ( ch_sam ) if ( call_variants ) { SAMTOOLS_SORT_INDEX ( SAMTOOLS_VIEW_BAM.out.bam ) @@ -33,6 +36,9 @@ workflow BAM_SORT_INDEX_SAMTOOLS { BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]) ) } + /* + * SUBWORKFLOW: Create stats using samtools + */ BAM_STATS_SAMTOOLS.out.stats .join ( BAM_STATS_SAMTOOLS.out.idxstats ) .join ( BAM_STATS_SAMTOOLS.out.flagstat ) diff --git a/subworkflows/local/bam_stats_samtools.nf b/subworkflows/local/bam_stats_samtools.nf index 97a03b6f..b9034c2c 100644 --- a/subworkflows/local/bam_stats_samtools.nf +++ b/subworkflows/local/bam_stats_samtools.nf @@ -11,8 +11,19 @@ workflow BAM_STATS_SAMTOOLS { ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] main: + /* + * Stats with samtools + */ SAMTOOLS_STATS ( ch_bam_bai ) + + /* + * Flagstat with samtools + */ SAMTOOLS_FLAGSTAT ( ch_bam_bai ) + + /* + * Idxstats with samtools + */ SAMTOOLS_IDXSTATS ( ch_bam_bai ) emit: diff --git a/subworkflows/local/bedtools_ucsc_bigwig.nf b/subworkflows/local/bedtools_ucsc_bigwig.nf index ab45a51e..a00748cb 100644 --- a/subworkflows/local/bedtools_ucsc_bigwig.nf +++ b/subworkflows/local/bedtools_ucsc_bigwig.nf @@ -20,7 +20,6 @@ workflow BEDTOOLS_UCSC_BIGWIG { /* * Convert BEDGraph to BigWig */ - UCSC_BEDGRAPHTOBIGWIG ( ch_bedgraph ) ch_bigwig = UCSC_BEDGRAPHTOBIGWIG.out.bigwig bedgraphtobigwig_version = UCSC_BEDGRAPHTOBIGWIG.out.versions diff --git a/subworkflows/local/dna_variant_calling.nf b/subworkflows/local/dna_variant_calling.nf deleted file mode 100644 index 517d05f0..00000000 --- a/subworkflows/local/dna_variant_calling.nf +++ /dev/null @@ -1,60 +0,0 @@ -/* - * DNA variant calling - */ - -include { MEDAKA_VARIANT } from '../../modules/local/medaka_variant' -include { SNIFFLES } from '../../modules/local/sniffles' - -workflow DNA_VARIANT_CALLING { - - main: - take: - ch_view_sortbam - ch_index - skip_medaka - skip_sniffles - - main: - ch_variant_calls = Channel.empty() - medaka_version = Channel.empty() - if (!skip_medaka){ - /* - * Split into a different channel for each chromosome - */ - // TODO Add module that cuts chromosomes from reference to use as regions to split variant calling - //SPLIT_CHROM( ch_view_sortbam ) - //.splitCsv() - //.combine( ch_view_sortbam ) // - //.unique() - //.map { it -> [ it[1], it[4], it[5], it[0] ] } // - //.map{ meta, bam, bai, chrom -> - //new_meta = meta.clone() - //new_meta.chrom = chrom - //[new_meta, bam, bai] - //}.set{ch_bam_vc_chrom} - - /* - * Call variants with MEDAKA - */ - MEDAKA_VARIANT( ch_view_sortbam, ch_index ) - ch_variant_calls = MEDAKA_VARIANT.out.variant_calls - medaka_version = MEDAKA_VARIANT.out.versions - } - ch_sv_calls = Channel.empty() - sniffles_version = Channel.empty() - if (!skip_sniffles){ - /* - * Call variants with SNIFFLES - */ - SNIFFLES( ch_view_sortbam ) - ch_sv_calls = SNIFFLES.out.sv_calls - sniffles_version = SNIFFLES.out.versions - } else{ - } - - emit: - ch_variant_calls - ch_sv_calls - medaka_version - sniffles_version -} diff --git a/subworkflows/local/input_check.nf b/subworkflows/local/input_check.nf index 0d580445..f38041df 100644 --- a/subworkflows/local/input_check.nf +++ b/subworkflows/local/input_check.nf @@ -10,6 +10,9 @@ workflow INPUT_CHECK { input_path main: + /* + * Check samplesheet is valid + */ SAMPLESHEET_CHECK ( samplesheet, input_path ) .csv .splitCsv ( header:true, sep:',' ) diff --git a/subworkflows/local/rna_fusions_jaffal.nf b/subworkflows/local/rna_fusions_jaffal.nf index c9b54ca1..2cef2997 100644 --- a/subworkflows/local/rna_fusions_jaffal.nf +++ b/subworkflows/local/rna_fusions_jaffal.nf @@ -12,11 +12,18 @@ workflow RNA_FUSIONS_JAFFAL { jaffal_ref_dir main: - if (jaffal_ref_dir) { ch_jaffal_ref_dir = file(params.jaffal_ref_dir, checkIfExists: true) } else { + + /* + * Get jaffel reference + */ GET_JAFFAL_REF() + + /* + * Untar jaffel reference + */ UNTAR( GET_JAFFAL_REF.out.ch_jaffal_ref ) ch_jaffal_ref_dir = UNTAR.out.untar } @@ -26,8 +33,7 @@ workflow RNA_FUSIONS_JAFFAL { .set { ch_jaffal_input } /* - * Align current signals to reference with Nanopolish + * Align current signals to reference with jaffel */ JAFFAL( ch_jaffal_input, ch_jaffal_ref_dir ) - } diff --git a/subworkflows/local/rna_modifications_xpore_m6anet.nf b/subworkflows/local/rna_modifications_xpore_m6anet.nf index 6140d92d..04a58211 100644 --- a/subworkflows/local/rna_modifications_xpore_m6anet.nf +++ b/subworkflows/local/rna_modifications_xpore_m6anet.nf @@ -14,7 +14,6 @@ workflow RNA_MODIFICATION_XPORE_M6ANET { ch_nanopolish_sortbam main: - ch_sample .join(ch_nanopolish_sortbam) .map { it -> [ it[0], it[2], it[3], it[7], it[6], it[8], it[9] ] } @@ -30,11 +29,16 @@ workflow RNA_MODIFICATION_XPORE_M6ANET { xpore_version = '' ch_xpore_dataprep_dirs = '' if (!params.skip_xpore) { + + /* + * Prepare data with xpore + */ XPORE_DATAPREP( ch_nanopolish_outputs ) ch_xpore_dataprep_dirs = XPORE_DATAPREP.out.dataprep_outputs ch_xpore_dataprep_dirs .map{ it -> it[1]+','+it[0].id } .set{ ch_xpore_diffmod_inputs } + /* * Differential modification expression with xpore */ diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index 3a436feb..4d65e9b0 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -32,64 +32,78 @@ workflow SHORT_VARIANT_CALLING { ch_chrom_names = GET_CHROM_NAMES.out.chrom_names /* - * Map + * Map chromosome names */ ch_chrom_names - .splitCsv() - .combine( ch_view_sortbam ) - .unique() - .map { chroms, meta, sizes, is_transcripts, bam, bai -> - new_meta = meta.clone() - new_meta.id = meta.id + "_" + chroms - new_meta.sample = meta.id - new_meta.chr = chroms - [new_meta, bam, bai, chroms] - }.set { ch_view_sortbam_split } + .splitCsv() + .combine( ch_view_sortbam ) + .unique() + .map { chroms, meta, sizes, is_transcripts, bam, bai -> + new_meta = meta.clone() + new_meta.id = meta.id + "_" + chroms + new_meta.sample = meta.id + new_meta.chr = chroms + [new_meta, bam, bai, chroms] + }.set { ch_view_sortbam_split } /* - * Call short variants - */ + * Call short variants + */ if (params.variant_caller == 'medaka') { + /* - * MEDAKA - */ + * Call short variants with medaka + */ MEDAKA_VARIANT( ch_view_sortbam_split, ch_fasta ) ch_versions = ch_versions.mix(medaka_version = MEDAKA_VARIANT.out.versions) + /* + * Zip medaka vcf + */ MEDAKA_BGZIP_VCF( MEDAKA_VARIANT.out.vcf ) ch_short_calls_vcf = MEDAKA_BGZIP_VCF.out.gz ch_versions = ch_versions.mix(bgzip_version = MEDAKA_BGZIP_VCF.out.versions) + /* + * Index medaka vcf.gz + */ MEDAKA_TABIX_VCF( ch_short_calls_vcf ) ch_short_calls_vcf_tbi = MEDAKA_TABIX_VCF.out.tbi ch_versions = ch_versions.mix(tabix_version = MEDAKA_TABIX_VCF.out.versions) } else if (params.variant_caller == 'deepvariant') { + /* - * DEEPVARIANT + * Call variants with deepvariant */ DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) ch_short_calls_vcf = DEEPVARIANT.out.vcf ch_short_calls_gvcf = DEEPVARIANT.out.gvcf ch_versions = ch_versions.mix(DEEPVARIANT.out.versions) + /* + * Index deepvariant vcf.gz + */ DEEPVARIANT_TABIX_VCF( ch_short_calls_vcf ) ch_short_calls_vcf_tbi = DEEPVARIANT_TABIX_VCF.out.tbi ch_versions = ch_versions.mix(DEEPVARIANT_TABIX_VCF.out.versions) + /* + * Index deepvariant g.vcf.gz + */ DEEPVARIANT_TABIX_GVCF( ch_short_calls_gvcf ) ch_short_calls_gvcf_tbi = DEEPVARIANT_TABIX_GVCF.out.tbi ch_versions = ch_versions.mix(DEEPVARIANT_TABIX_VCF.out.versions) } else { + /* - * PEPPER_MARGIN_DEEPVARIANT - */ + * Call variants with pepper_margin_deepvariant (automatic zip + index, docker + singularity only) + */ PEPPER_MARGIN_DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) ch_short_calls_vcf = PEPPER_MARGIN_DEEPVARIANT.out.vcf ch_short_calls_vcf_tbi = PEPPER_MARGIN_DEEPVARIANT.out.tbi ch_versions = ch_versions.mix(PEPPER_MARGIN_DEEPVARIANT.out.versions) - } emit: @@ -98,5 +112,4 @@ workflow SHORT_VARIANT_CALLING { ch_short_calls_gvcf ch_short_calls_gvcf_tbi ch_versions - } diff --git a/subworkflows/local/structural_variant_calling.nf b/subworkflows/local/structural_variant_calling.nf index 67793049..677737fe 100644 --- a/subworkflows/local/structural_variant_calling.nf +++ b/subworkflows/local/structural_variant_calling.nf @@ -25,64 +25,76 @@ workflow STRUCTURAL_VARIANT_CALLING { ch_versions = Channel.empty() /* - * Get names of chromosomes from bam file + * Get chromosomes from bam file for splitting calling */ GET_CHROM_NAMES( ch_view_sortbam ) ch_chrom_names = GET_CHROM_NAMES.out.chrom_names /* - * Map - */ + * Map chromosome names + */ ch_chrom_names - .splitCsv() - .combine( ch_view_sortbam ) - .unique() - .map { chroms, meta, sizes, is_transcripts, bam, bai -> - new_meta = meta.clone() - new_meta.id = meta.id + "_" + chroms - new_meta.sample = meta.id - new_meta.chr = chroms - [new_meta, bam, bai, chroms] - }.set { ch_view_sortbam_split } + .splitCsv() + .combine( ch_view_sortbam ) + .unique() + .map { chroms, meta, sizes, is_transcripts, bam, bai -> + new_meta = meta.clone() + new_meta.id = meta.id + "_" + chroms + new_meta.sample = meta.id + new_meta.chr = chroms + [new_meta, bam, bai, chroms] + }.set { ch_view_sortbam_split } /* - * Call structural variants - */ + * Call structural variants with sniffles + */ if (params.structural_variant_caller == 'sniffles') { + /* - * SNIFFLES - */ + * Call structural variants with sniffles + */ SNIFFLES( ch_view_sortbam ) ch_versions = ch_versions.mix(SNIFFLES.out.versions) + /* + * Zip sniffles vcf + */ SNIFFLES_BGZIP_VCF( SNIFFLES.out.sv_calls ) ch_sv_calls_vcf = SNIFFLES_BGZIP_VCF.out.gz ch_versions = ch_versions.mix(SNIFFLES_BGZIP_VCF.out.versions) + /* + * Index sniffles vcf.gz + */ SNIFFLES_TABIX_VCF( ch_sv_calls_vcf ) ch_sv_calls_tbi = SNIFFLES_TABIX_VCF.out.tbi ch_versions = ch_versions.mix(SNIFFLES_TABIX_VCF.out.versions) - } else { + } else if (params.structural_variant_caller == 'cutesv') { + /* - * CUTESV + * Call structural variants with cutesv */ CUTESV( ch_view_sortbam, ch_fasta ) ch_versions = ch_versions.mix(CUTESV.out.versions) + /* + * Zip cutesv vcf + */ CUTESV_BGZIP_VCF( CUTESV.out.sv_calls ) ch_sv_calls_vcf = CUTESV_BGZIP_VCF.out.gz ch_versions = ch_versions.mix(CUTESV_BGZIP_VCF.out.versions) + /* + * Zip cutesv vcf.gz + */ CUTESV_TABIX_VCF( ch_sv_calls_vcf ) ch_sv_calls_tbi = CUTESV_TABIX_VCF.out.tbi ch_versions = ch_versions.mix(CUTESV_TABIX_VCF.out.versions) - } emit: ch_sv_calls_vcf ch_sv_calls_vcf_tbi ch_versions - } diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index e17cd49e..3a847631 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -15,7 +15,11 @@ checkPathParamList = [ params.input, params.multiqc_config ] for (param in checkPathParamList) { if (param) { file(param, checkIfExists: true) } } // Check mandatory parameters (missing protocol or profile will exit the run.) -if (params.input) { ch_input = file(params.input) } else { exit 1, 'Input samplesheet not specified!' } +if (params.input) { + ch_input = file(params.input) +} else { + exit 1, 'Input samplesheet not specified!' +} // Function to check if running offline def isOffline() { @@ -29,6 +33,13 @@ def isOffline() { def ch_guppy_model = Channel.empty() def ch_guppy_config = Channel.empty() + +// Check protocol is a known type +if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { + exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" +} + +// Check other parameters are sufficient/match if (!params.skip_basecalling) { // Need to stage guppy_config properly depending on whether its a file or string if (!params.guppy_config) { @@ -44,7 +55,6 @@ if (!params.skip_basecalling) { ch_guppy_model = Channel.fromPath(params.guppy_model) } } - } else { if (!params.skip_demultiplexing) { if (!params.barcode_kit) { @@ -88,11 +98,6 @@ if (params.call_variants) { } } - if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { - exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" - } - - if (!params.skip_quantification) { if (params.quantification_method != 'bambu' && params.quantification_method != 'stringtie2') { exit 1, "Invalid transcript quantification option: ${params.quantification_method}. Valid options: 'bambu', 'stringtie2'" @@ -153,7 +158,7 @@ include { NANOLYSE } from '../modules/nf-core/modules/nanolys include { CUSTOM_DUMPSOFTWAREVERSIONS } from '../modules/nf-core/modules/custom/dumpsoftwareversions/main' /* - * SUBWORKFLOW: Consisting entirely of nf-core/modules (BAM_SORT_SAMTOOLS & BAM_STAT_SAMTOOLS are within two local subworkflows) + * SUBWORKFLOW: Consisting entirely of nf-core/modules */ //////////////////////////////////////////////////// @@ -167,11 +172,11 @@ workflow NANOSEQ{ // Pre-download test-dataset to get files for '--input_path' parameter // Nextflow is unable to recursively download directories via HTTPS - if (workflow.profile.contains('test') && !workflow.profile.contains('vc')){ + if (workflow.profile.contains('test') && !workflow.profile.contains('vc')) { if (!params.skip_basecalling || !params.skip_modification_analysis) { if (!isOffline()) { GET_TEST_DATA () - if (params.skip_modification_analysis){ + if (params.skip_modification_analysis) { GET_TEST_DATA.out.ch_input_fast5s_path .set { ch_input_path } } else { @@ -196,14 +201,18 @@ workflow NANOSEQ{ } } + /* + * Create empty software versions channel to mix + */ + ch_software_versions = Channel.empty() + /* * SUBWORKFLOW: Read in samplesheet, validate and stage input files */ INPUT_CHECK ( ch_input, ch_input_path ) .set { ch_sample } - ch_software_versions = Channel.empty() - if (!params.skip_basecalling){ + if (!params.skip_basecalling) { ch_sample .first() .map { it[0] } @@ -216,7 +225,7 @@ workflow NANOSEQ{ ch_guppy_summary = GUPPY.out.summary ch_software_versions = ch_software_versions.mix(GUPPY.out.versions.ifEmpty(null)) - if (params.skip_demultiplexing){ + if (params.skip_demultiplexing) { ch_sample .map { it -> [ it[0], it[0].id, it[2], it[3], it[4], it[5] ] } .set { ch_sample } @@ -229,6 +238,7 @@ workflow NANOSEQ{ .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } .set { ch_fastq } if (params.output_demultiplex_fast5) { + /* * MODULE: Demultiplex fast5 files using ont_fast5_api/demux_fast5 */ @@ -238,7 +248,7 @@ workflow NANOSEQ{ } else { ch_guppy_summary = Channel.empty() - if (!params.skip_demultiplexing){ + if (!params.skip_demultiplexing) { /* * MODULE: Demultipexing using qcat @@ -252,9 +262,8 @@ workflow NANOSEQ{ .map { it -> [ it[2], it[1], it[3], it[4], it[5], it[6] ] } .set { ch_fastq } ch_software_versions = ch_software_versions.mix(QCAT.out.versions.ifEmpty(null)) - } else { - if (!params.skip_alignment){ + if (!params.skip_alignment) { ch_sample .map { it -> if (it[6].toString().endsWith('.gz')) [ it[0], it[6], it[2], it[1], it[4], it[5] ] } .set { ch_fastq } @@ -269,8 +278,8 @@ workflow NANOSEQ{ .map { it -> [ it[0], it[1] ] } .set { ch_fastq_nanolyse } - if (!params.nanolyse_fasta){ - if (!isOffline()){ + if (!params.nanolyse_fasta) { + if (!isOffline()) { GET_NANOLYSE_FASTA ().set { ch_nanolyse_fasta } } else { exit 1, "NXF_OFFLINE=true or -offline has been set so cannot download lambda.fasta.gz file for running NanoLyse! Please explicitly specify --nanolyse_fasta." @@ -279,8 +288,8 @@ workflow NANOSEQ{ ch_nanolyse_fasta = file(params.nanolyse_fasta, checkIfExists: true) } /* - * MODULE: DNA contaminant removal using NanoLyse - */ + * MODULE: DNA contaminant removal using NanoLyse + */ NANOLYSE ( ch_fastq_nanolyse, ch_nanolyse_fasta ) NANOLYSE.out.fastq .join( ch_sample ) @@ -291,8 +300,8 @@ workflow NANOSEQ{ ch_pycoqc_multiqc = Channel.empty() ch_fastqc_multiqc = Channel.empty() - if (!params.skip_qc){ - if (!params.skip_basecalling){ + if (!params.skip_qc) { + if (!params.skip_basecalling) { /* * SUBWORKFLOW: Basecalling QC with PycoQC and Nanoplot @@ -306,7 +315,7 @@ workflow NANOSEQ{ * SUBWORKFLOW: Fastq QC with Nanoplot and fastqc */ QCFASTQ_NANOPLOT_FASTQC ( ch_fastq, params.skip_nanoplot, params.skip_fastqc) - if (params.skip_basecalling){ + if (params.skip_basecalling) { ch_software_versions = ch_software_versions.mix(QCFASTQ_NANOPLOT_FASTQC.out.nanoplot_version.first().ifEmpty(null)) } ch_software_versions = ch_software_versions.mix(QCFASTQ_NANOPLOT_FASTQC.out.fastqc_version.first().ifEmpty(null)) @@ -314,12 +323,11 @@ workflow NANOSEQ{ } ch_samtools_multiqc = Channel.empty() - if (!params.skip_alignment){ + if (!params.skip_alignment) { /* - * SUBWORKFLOW: Make chromosome size file and covert GTF to BED12 - */ - ch_fastq.view() + * SUBWORKFLOW: Make chromosome size file and covert GTF to BED12 + */ PREPARE_GENOME ( ch_fastq ) ch_fasta_index = PREPARE_GENOME.out.ch_fasta_index ch_gtf_bed = PREPARE_GENOME.out.ch_gtf_bed @@ -328,6 +336,7 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.samtools_version.first().ifEmpty(null)) ch_software_versions = ch_software_versions.mix(PREPARE_GENOME.out.gtf2bed_version.first().ifEmpty(null)) if (params.aligner == 'minimap2') { + /* * SUBWORKFLOW: Align fastq files with minimap2 and sort bam files */ @@ -355,23 +364,23 @@ workflow NANOSEQ{ ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) /* - * SUBWORKFLOW: Short variant calling - */ + * SUBWORKFLOW: Short variant calling + */ if (params.call_variants && params.protocol == 'DNA' && !params.skip_vc) { SHORT_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) } /* - * SUBWORKFLOW: Structural variant calling - */ + * SUBWORKFLOW: Structural variant calling + */ if (params.call_variants && params.protocol == 'DNA' && !params.skip_sv) { STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) } ch_bedtools_version = Channel.empty() - if (!params.skip_bigwig){ + if (!params.skip_bigwig) { /* * SUBWORKFLOW: Convert BAM -> BEDGraph -> BigWig @@ -380,7 +389,7 @@ workflow NANOSEQ{ ch_bedtools_version = ch_bedtools_version.mix(BEDTOOLS_UCSC_BIGWIG.out.bedtools_version.first().ifEmpty(null)) ch_software_versions = ch_software_versions.mix(BEDTOOLS_UCSC_BIGWIG.out.bedgraphtobigwig_version.first().ifEmpty(null)) } - if (!params.skip_bigbed){ + if (!params.skip_bigbed) { /* * SUBWORKFLOW: Convert BAM -> BED12 -> BigBED @@ -431,16 +440,17 @@ workflow NANOSEQ{ .set { ch_sample_annotation } /* - * MODULE: Quantification and novel isoform detection with bambu - */ + * MODULE: Quantification and novel isoform detection with bambu + */ BAMBU ( ch_sample_annotation, ch_sortbam.collect{ it [1] } ) ch_gene_counts = BAMBU.out.ch_gene_counts ch_transcript_counts = BAMBU.out.ch_transcript_counts ch_software_versions = ch_software_versions.mix(BAMBU.out.versions.first().ifEmpty(null)) } else { + /* - * SUBWORKFLOW: Novel isoform detection with StringTie and Quantification with featureCounts - */ + * SUBWORKFLOW: Novel isoform detection with StringTie and Quantification with featureCounts + */ QUANTIFY_STRINGTIE_FEATURECOUNTS( ch_sample, ch_sortbam ) ch_gene_counts = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.ch_gene_counts ch_transcript_counts = QUANTIFY_STRINGTIE_FEATURECOUNTS.out.ch_transcript_counts @@ -452,8 +462,8 @@ workflow NANOSEQ{ if (!params.skip_differential_analysis) { /* - * SUBWORKFLOW: Differential gene and transcript analysis with DESeq2 and DEXseq - */ + * SUBWORKFLOW: Differential gene and transcript analysis with DESeq2 and DEXseq + */ DIFFERENTIAL_DESEQ2_DEXSEQ( ch_gene_counts, ch_transcript_counts ) ch_software_versions = ch_software_versions.mix(DIFFERENTIAL_DESEQ2_DEXSEQ.out.deseq2_version.first().ifEmpty(null)) ch_software_versions = ch_software_versions.mix(DIFFERENTIAL_DESEQ2_DEXSEQ.out.dexseq_version.first().ifEmpty(null)) @@ -461,6 +471,7 @@ workflow NANOSEQ{ } if (!params.skip_modification_analysis && params.protocol == 'directRNA') { + /* * SUBWORKFLOW: RNA modification detection with xPore and m6anet */ @@ -470,25 +481,25 @@ workflow NANOSEQ{ if (!params.skip_fusion_analysis && (params.protocol == 'cDNA' || params.protocol == 'directRNA')) { /* - * SUBWORKFLOW: RNA_FUSIONS_JAFFAL - */ + * SUBWORKFLOW: RNA_FUSIONS_JAFFAL + */ RNA_FUSIONS_JAFFAL( ch_sample, params.jaffal_ref_dir ) } /* - * MODULE: Parse software version numbers - */ + * MODULE: Parse software version numbers + */ CUSTOM_DUMPSOFTWAREVERSIONS ( ch_software_versions.unique().collectFile() ) - if (!params.skip_multiqc){ + if (!params.skip_multiqc) { workflow_summary = WorkflowNanoseq.paramsSummaryMultiqc(workflow, summary_params) ch_workflow_summary = Channel.value(workflow_summary) /* - * MODULE: MultiQC - */ + * MODULE: MultiQC + */ MULTIQC ( ch_multiqc_config, ch_multiqc_custom_config.collect().ifEmpty([]), From f2d3d1b1a7cc559a3bd04add1c266039f7a0215f Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 27 Apr 2022 10:57:23 +0200 Subject: [PATCH 124/169] Passing prettier and lint checks --- modules.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules.json b/modules.json index 985a32b7..880ef889 100644 --- a/modules.json +++ b/modules.json @@ -47,4 +47,4 @@ } } } -} \ No newline at end of file +} From 58d6daaac4c3ff57e76985e2065045eafbbf7cae Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 27 Apr 2022 18:25:26 +0200 Subject: [PATCH 125/169] Add tags to modules --- modules/local/bedtools_genomecov.nf | 1 + modules/local/get_chrom_names.nf | 6 ++++-- modules/local/get_chrom_sizes.nf | 5 +++-- modules/local/graphmap2_index.nf | 1 + modules/local/minimap2_index.nf | 3 ++- 5 files changed, 11 insertions(+), 5 deletions(-) diff --git a/modules/local/bedtools_genomecov.nf b/modules/local/bedtools_genomecov.nf index 6c510eb5..7b7355bf 100644 --- a/modules/local/bedtools_genomecov.nf +++ b/modules/local/bedtools_genomecov.nf @@ -1,4 +1,5 @@ process BEDTOOLS_GENOMECOV { + tag "$meta.id" label 'process_medium' conda (params.enable_conda ? "bioconda::bedtools=2.29.2" : null) diff --git a/modules/local/get_chrom_names.nf b/modules/local/get_chrom_names.nf index a7c85ccf..b188a0cd 100644 --- a/modules/local/get_chrom_names.nf +++ b/modules/local/get_chrom_names.nf @@ -1,4 +1,6 @@ process GET_CHROM_NAMES { + tag "$meta.id" + label 'process_medium' conda (params.enable_conda ? "bioconda::samtools=1.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -9,8 +11,8 @@ process GET_CHROM_NAMES { tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) output: - path('chrom.names') , emit: chrom_names - path "versions.yml" , emit: versions + path "chrom.names" , emit: chrom_names + path "versions.yml" , emit: versions script: """ diff --git a/modules/local/get_chrom_sizes.nf b/modules/local/get_chrom_sizes.nf index 5162d7e5..d182a588 100644 --- a/modules/local/get_chrom_sizes.nf +++ b/modules/local/get_chrom_sizes.nf @@ -1,4 +1,6 @@ process GET_CHROM_SIZES { + tag "$fasta" + label 'process_medium' conda (params.enable_conda ? "bioconda::samtools=1.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? @@ -10,8 +12,7 @@ process GET_CHROM_SIZES { output: tuple path('*.sizes'), val(name) , emit: sizes - // path '*.fai' , emit: fai - path "versions.yml" , emit: versions + path "versions.yml" , emit: versions script: """ diff --git a/modules/local/graphmap2_index.nf b/modules/local/graphmap2_index.nf index 07d4a182..380c5710 100644 --- a/modules/local/graphmap2_index.nf +++ b/modules/local/graphmap2_index.nf @@ -1,4 +1,5 @@ process GRAPHMAP2_INDEX { + tag "$fasta" label 'process_high' conda (params.enable_conda ? "bioconda::graphmap=0.6.3" : null) diff --git a/modules/local/minimap2_index.nf b/modules/local/minimap2_index.nf index fb63cac0..1ecd41f3 100644 --- a/modules/local/minimap2_index.nf +++ b/modules/local/minimap2_index.nf @@ -1,5 +1,6 @@ process MINIMAP2_INDEX { - label 'process_medium' + tag "$fasta" + label 'process_high' conda (params.enable_conda ? "bioconda::minimap2=2.17" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? From 8f6933922e94b4480bb041d0c1e99dc0392fd42c Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 27 Apr 2022 18:30:57 +0200 Subject: [PATCH 126/169] Lint fix --- modules/local/samtools_faidx.nf | 2 -- 1 file changed, 2 deletions(-) diff --git a/modules/local/samtools_faidx.nf b/modules/local/samtools_faidx.nf index 5850cb03..a10db745 100644 --- a/modules/local/samtools_faidx.nf +++ b/modules/local/samtools_faidx.nf @@ -1,5 +1,3 @@ - - process SAMTOOLS_FAIDX { tag "$fasta" label 'process_low' From f09756ca3a4063bfbd489511f1d652032dac9a65 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 09:06:20 +0800 Subject: [PATCH 127/169] add other test configs back into ci --- .github/workflows/ci.yml | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7f5bbe41..81390c8d 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -42,8 +42,32 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ + - name: Run pipeline with test data + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test,docker + profile: + name: Run profile tests + if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} + runs-on: ubuntu-latest + env: + NXF_VER: '21.10.3' + NXF_ANSI_LOG: false + strategy: + matrix: + profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx_vc, test_nobc_nodx_stringtie, test_nobc_nodx_noaln, test_nobc_nodx_rnamod] + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Install Nextflow + env: + CAPSULE_LOG: none + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + - name: Run pipeline with different profiles run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results + nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.profiles }},docker --outdir ./results # From e3d02998c5205ca558d63b4115f109c4f17e45ca Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 09:31:49 +0800 Subject: [PATCH 128/169] prettier?? --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 81390c8d..5348d435 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,12 +45,13 @@ jobs: - name: Run pipeline with test data run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker + profile: name: Run profile tests if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} runs-on: ubuntu-latest env: - NXF_VER: '21.10.3' + NXF_VER: "21.10.3" NXF_ANSI_LOG: false strategy: matrix: From 0f2833bc5fdb586d61c34aba5aa7e80e0763a6fb Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 09:38:03 +0800 Subject: [PATCH 129/169] hopefully this is pretty enough --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5348d435..afa49702 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,7 +48,7 @@ jobs: profile: name: Run profile tests - if: ${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }} + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }}" runs-on: ubuntu-latest env: NXF_VER: "21.10.3" From d13a9c679eb2204dce8785f4a0a5e92a5a817258 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 09:50:30 +0800 Subject: [PATCH 130/169] PRETTY! --- .github/workflows/ci.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index afa49702..694c02b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -55,7 +55,13 @@ jobs: NXF_ANSI_LOG: false strategy: matrix: - profiles: [test_bc_nodx, test_nobc_dx, test_nobc_nodx_vc, test_nobc_nodx_stringtie, test_nobc_nodx_noaln, test_nobc_nodx_rnamod] + profiles: + - "test_bc_nodx" + - "test_nobc_dx" + - "test_nobc_nodx_vc" + - "test_nobc_nodx_stringtie" + - "test_nobc_nodx_noaln" + - "test_nobc_nodx_rnamod" steps: - name: Check out pipeline code uses: actions/checkout@v2 From 177bdf43a0082104d32e62eed5be6af59ba1f3fe Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 10:02:43 +0800 Subject: [PATCH 131/169] oom problem from running ci on github --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 694c02b3..90bf90b4 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,8 +26,8 @@ jobs: - NXF_VER: "21.10.3" NXF_EDGE: "" # Test latest edge release of Nextflow - - NXF_VER: "" - NXF_EDGE: "1" + #- NXF_VER: "" + # NXF_EDGE: "1" steps: - name: Check out pipeline code uses: actions/checkout@v2 From cc93d4c2ccecff4a4fa82d63de32bc3b1ea5590d Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 10:07:52 +0800 Subject: [PATCH 132/169] test_nobc_nodx_vc memory requirement > 7 GB --- .github/workflows/ci.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 90bf90b4..fdc3461c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -26,8 +26,8 @@ jobs: - NXF_VER: "21.10.3" NXF_EDGE: "" # Test latest edge release of Nextflow - #- NXF_VER: "" - # NXF_EDGE: "1" + - NXF_VER: "" + NXF_EDGE: "1" steps: - name: Check out pipeline code uses: actions/checkout@v2 @@ -58,7 +58,7 @@ jobs: profiles: - "test_bc_nodx" - "test_nobc_dx" - - "test_nobc_nodx_vc" + #- "test_nobc_nodx_vc" - "test_nobc_nodx_stringtie" - "test_nobc_nodx_noaln" - "test_nobc_nodx_rnamod" From 2ffac5320ade79ce8f0047292b51e88385efa856 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 10:24:13 +0800 Subject: [PATCH 133/169] lower max_memory from 8 GB to 6 GB --- conf/test_nobc_nodx_vc.config | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 07b3b98d..13d9c28b 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -13,7 +13,7 @@ params { // Limit resources so that this can run on Travis max_cpus = 2 - max_memory = 8.GB + max_memory = 6.GB max_time = 12.h // Input data to skip basecalling and demultiplexing, and variant call From dcb2c97d95aabc1d43ba61be663fc50f025bfbd8 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 10:25:26 +0800 Subject: [PATCH 134/169] add test_nobc_nodx_vc back --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fdc3461c..694c02b3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -58,7 +58,7 @@ jobs: profiles: - "test_bc_nodx" - "test_nobc_dx" - #- "test_nobc_nodx_vc" + - "test_nobc_nodx_vc" - "test_nobc_nodx_stringtie" - "test_nobc_nodx_noaln" - "test_nobc_nodx_rnamod" From 008d9a31f4923efa458c198708f3ce62e173f0bc Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 11:06:22 +0800 Subject: [PATCH 135/169] add parameters check to ci --- .github/workflows/ci.yml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 694c02b3..088296d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -77,4 +77,32 @@ jobs: run: | nextflow run ${GITHUB_WORKSPACE} -profile ${{ matrix.profiles }},docker --outdir ./results + parameters: + name: Run parameter tests + if: "${{ github.event_name != 'push' || (github.event_name == 'push' && github.repository == 'nf-core/nanoseq') }}" + runs-on: ubuntu-latest + env: + NXF_VER: "21.10.3" + NXF_ANSI_LOG: false + strategy: + matrix: + parameters: + - "--aligner graphmap2" + - "--skip_alignment" + - "--skip_qc" + - "--skip_quantification" + steps: + - name: Check out pipeline code + uses: actions/checkout@v2 + + - name: Install Nextflow + env: + CAPSULE_LOG: none + run: | + wget -qO- get.nextflow.io | bash + sudo mv nextflow /usr/local/bin/ + + - name: Run pipeline with different parameters + run: | + nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} # From 73dc8fa44f9180cf4da76aff3ee9aeae4026bb53 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 12:04:20 +0800 Subject: [PATCH 136/169] PRETTY!! --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 088296d8..550acfb8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -105,4 +105,5 @@ jobs: - name: Run pipeline with different parameters run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker ${{ matrix.parameters }} + # From 8e853f2be87e7979b981d95ceacbb08dafe30c04 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:25:04 +0800 Subject: [PATCH 137/169] Update usage.md --- docs/usage.md | 82 +++++++++++++++++++++------------------------------ 1 file changed, 34 insertions(+), 48 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index ab3596c1..35891910 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,19 +14,8 @@ You will need to create a file with information about the samples in your experi | `replicate` | Integer representing replicate number. Must start from `1..`. | | `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | | `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam" | -| `genome` | Genome fasta file for alignment. This can either be blank, a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | -| `transcriptome` | Transcriptome fasta/gtf file for alignment. This can either be blank or a local path. Must have the extension ".fasta", ".fasta.gz", ".fa", ".fa.gz", ".gtf" or ".gtf.gz". | - -### Specifying a reference genome/transcriptome - -Each sample in the sample sheet can be mapped to its own reference genome or transcriptome. Please see below for additional details required to fill in the `genome` and `transcriptome` columns appropriately: - -- If both `genome` and `transcriptome` are not specified then the mapping will be skipped for that sample. -- If both `genome` and `transcriptome` are specified as local fasta files then the transcriptome will be preferentially used for mapping. -- If `genome` is specified as a local fasta file and `transcriptome` is left blank then mapping will be performed relative to the genome. -- If `genome` isnt specified and `transcriptome` is provided as a fasta file then mapping will be performed relative to the transcriptome. -- If `genome` is specified as an AWS iGenomes key then the `transcriptome` column can be blank. The associated gtf file for the `transcriptome` will be automatically obtained in order to create a transcriptome fasta file. However, the reads will only be mapped to the transcriptome if `--protocol cDNA` or `--protocol directRNA`. If `--protocol DNA` then the reads will still be mapped to the genome essentially ignoring the gtf file. -- If `genome` is specified as a local fasta file and `transcriptome` is a specified as a local gtf file then both of these will be used to create a transcriptome fasta file. However, the reads will only be mapped to the transcriptome if `--protocol cDNA` or `--protocol directRNA`. If `--protocol DNA` then the reads will still be mapped to the genome essentially ignoring the gtf file. +| `fasta` | Genome fasta file or transcriptome fasta for alignment. This can either be a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | +| `gtf` | Annotation gtf file. This can either be blank (if not running transcript quantification and/or RNA modification detection) or a local path. Must have the extension ".gtf". | ### Skip basecalling/demultiplexing @@ -37,7 +26,7 @@ As shown in the examples below, the accepted format of the file is slightly diff ##### Example `samplesheet.csv` for barcoded fast5 inputs ```bash -group,replicate,barcode,input_file,genome,transcriptome +group,replicate,barcode,input_file,fasta,gtf WT_MOUSE,1,1,,mm10, WT_HUMAN,1,2,,hg19, WT_POMBE,1,3,,/path/to/local/genome.fa, @@ -64,7 +53,7 @@ nextflow run nf-core/nanoseq \ ##### Example `samplesheet.csv` for non-barcoded fast5 inputs ```bash -group,replicate,barcode,input_file,genome,transcriptome +group,replicate,barcode,input_file,fasta,gtf SAMPLE,1,1,/path/to/local/genome.fa,, ``` @@ -88,7 +77,7 @@ nextflow run nf-core/nanoseq \ ##### Example `samplesheet.csv` for non-demultiplexed fastq inputs ```bash -group,replicate,barcode,input_file,genome,transcriptome +group,replicate,barcode,input_file,fasta,gtf WT_MOUSE,1,1,,mm10, WT_HUMAN,1,2,,hg19, WT_POMBE,1,3,,/path/to/local/genome.fa, @@ -114,7 +103,7 @@ nextflow run nf-core/nanoseq \ ##### Example `samplesheet.csv` for demultiplexed fastq inputs ```bash -group,replicate,barcode,input_file,genome,transcriptome +group,replicate,barcode,input_file,fasta,gtf WT,1,,SAM101A1.fastq.gz,hg19, WT,2,,SAM101A2.fastq.gz,hg19, KO,1,,SAM101A3.fastq.gz,hg19, @@ -137,7 +126,7 @@ nextflow run nf-core/nanoseq \ ##### Example `samplesheet.csv` for BAM inputs ```bash -group,replicate,barcode,input_file,genome,transcriptome +group,replicate,barcode,input_file,fasta,gtf WT,1,,SAM101A1.bam,hg19, WT,2,,SAM101A2.bam,hg19, KO,1,,SAM101A3.bam,hg19, @@ -156,44 +145,41 @@ nextflow run nf-core/nanoseq \ -profile ``` -## Samplesheet input +##### RNA modification detection (please run basecalling prior) -You will need to create a samplesheet with information about the samples you would like to analyse before running the pipeline. Use this parameter to specify its location. It has to be a comma-separated file with 3 columns, and a header row as shown in the examples below. +##### Example `samplesheet.csv` for FAST5 and FASTQ input directories -```console ---input '[path to samplesheet file]' +```bash +group,replicate,barcode,input_file,fasta,gtf +WT,1,,/full/path/to/SAM101A1/,hg19.fasta,hg19.gtf +WT,2,,/full/path/to/SAM101A2/,hg19.fasta,hg19.gtf +KO,1,,/full/path/to/SAM101A3/,hg19.fasta,hg19.gtf +KO,2,,/full/path/to/SAM101A4/,hg19.fasta,hg19.gtf ``` - -### Multiple runs of the same sample - -The `sample` identifiers have to be the same when you have re-sequenced the same sample more than once e.g. to increase sequencing depth. The pipeline will concatenate the raw reads before performing any downstream analysis. Below is an example for the same sample sequenced across 3 lanes: - -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L003_R1_001.fastq.gz,AEG588A1_S1_L003_R2_001.fastq.gz -CONTROL_REP1,AEG588A1_S1_L004_R1_001.fastq.gz,AEG588A1_S1_L004_R2_001.fastq.gz +Each of the FAST5 and FASTQ input directory should have the following structure: +``` + + ├── fast5 + ├── xxxxxxxxxxxxxxx1.fast5 + ├── xxxxxxxxxxxxxxx2.fast5 + ├── . + ├── . + └── . + ├── fastq + └── _basecalled.fastq.gz ``` -### Full samplesheet - -The pipeline will auto-detect whether a sample is single- or paired-end using the information provided in the samplesheet. The samplesheet can have as many columns as you desire, however, there is a strict requirement for the first 3 columns to match those defined in the table below. - -A final samplesheet file consisting of both single- and paired-end data may look something like the one below. This is for 6 samples, where `TREATMENT_REP3` has been sequenced twice. +##### Example command for RNA modification detection -```console -sample,fastq_1,fastq_2 -CONTROL_REP1,AEG588A1_S1_L002_R1_001.fastq.gz,AEG588A1_S1_L002_R2_001.fastq.gz -CONTROL_REP2,AEG588A2_S2_L002_R1_001.fastq.gz,AEG588A2_S2_L002_R2_001.fastq.gz -CONTROL_REP3,AEG588A3_S3_L002_R1_001.fastq.gz,AEG588A3_S3_L002_R2_001.fastq.gz -TREATMENT_REP1,AEG588A4_S4_L003_R1_001.fastq.gz, -TREATMENT_REP2,AEG588A5_S5_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L003_R1_001.fastq.gz, -TREATMENT_REP3,AEG588A6_S6_L004_R1_001.fastq.gz, +```bash +nextflow run nf-core/nanoseq \ + --input samplesheet.csv \ + --protocol directRNA \ + --skip_basecalling \ + --skip_demultiplexing \ + -profile ``` -An [example samplesheet](../assets/samplesheet.csv) has been provided with the pipeline. - ## Running the pipeline The typical command for running the pipeline is as follows: From 097eb68bc8ded11f2c529c8bdd392e7a71bfb331 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:30:39 +0800 Subject: [PATCH 138/169] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b058cd83..f621f09c 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# ![nf-core/nanoseq](docs/images/nf-core/nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core/nanoseq_logo_dark.png#gh-dark-mode-only) +# ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+linting%22) From a1a37c34509668fd63acb2553b0b1b86a978cb5f Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:37:08 +0800 Subject: [PATCH 139/169] PRETTY!! --- docs/usage.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 35891910..faea7a6d 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -156,8 +156,10 @@ WT,2,,/full/path/to/SAM101A2/,hg19.fasta,hg19.gtf KO,1,,/full/path/to/SAM101A3/,hg19.fasta,hg19.gtf KO,2,,/full/path/to/SAM101A4/,hg19.fasta,hg19.gtf ``` -Each of the FAST5 and FASTQ input directory should have the following structure: -``` + +##### Each of the FAST5 and FASTQ input directory should have the following structure: + +```bash ├── fast5 ├── xxxxxxxxxxxxxxx1.fast5 From a80b3c8c30dbe4a9cfd1182f91194b77ac8fb700 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:42:29 +0800 Subject: [PATCH 140/169] pretty?? --- docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index faea7a6d..4b2d81ad 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,8 +14,8 @@ You will need to create a file with information about the samples in your experi | `replicate` | Integer representing replicate number. Must start from `1..`. | | `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | | `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam" | -| `fasta` | Genome fasta file or transcriptome fasta for alignment. This can either be a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | -| `gtf` | Annotation gtf file. This can either be blank (if not running transcript quantification and/or RNA modification detection) or a local path. Must have the extension ".gtf". | +| `genome` | Genome fasta file for alignment. This can either be blank, a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | +| `transcriptome` | Transcriptome fasta/gtf file for alignment. This can either be blank or a local path. Must have the extension ".fasta", ".fasta.gz", ".fa", ".fa.gz", ".gtf" or ".gtf.gz". | ### Skip basecalling/demultiplexing From 92f55addd244f030bf15d76f9551755e4938de88 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 13:53:36 +0800 Subject: [PATCH 141/169] PRETTY!! --- docs/usage.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/usage.md b/docs/usage.md index 4b2d81ad..77779ce4 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -14,8 +14,8 @@ You will need to create a file with information about the samples in your experi | `replicate` | Integer representing replicate number. Must start from `1..`. | | `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | | `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam" | -| `genome` | Genome fasta file for alignment. This can either be blank, a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | -| `transcriptome` | Transcriptome fasta/gtf file for alignment. This can either be blank or a local path. Must have the extension ".fasta", ".fasta.gz", ".fa", ".fa.gz", ".gtf" or ".gtf.gz". | +| `fasta` | Genome fasta file or transcriptome fasta file for alignment. This can either be a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | +| `gtf` | Annotation gtf file for transcript discovery and quantification and RNA modification detection. This can either be blank or a local path. Must have the extension ".gtf". | ### Skip basecalling/demultiplexing From d446cbe7dd77db2b5ef25d6d27b32879f21de094 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Thu, 28 Apr 2022 14:02:46 +0800 Subject: [PATCH 142/169] Update CHANGELOG.md --- CHANGELOG.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a85df152..543a06b2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [3.0.0] - ? +## [3.0.0] - 2022-05-10 ### Major enhancements @@ -42,11 +42,13 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `bioconductor-bambu` | 1.0.2 | 2.0.0 | | `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | | `cutesv` | | 1.0.12 | +| `deepvariant` | | 1.0.3 | | `jaffa` | | 2.0 | | `m6anet` | | 1.0 | | `medaka` | | 1.4.4 | | `multiqc` | 1.10.1 | 1.11 | | `ont_fast5_api` | | 4.0.0 | +| `pepper_deepvariant` | | 0.8 | | `sniffles` | | 1.0.12 | | `xpore` | | 2.1 | From 5885da02c93d8a253bb63b6ee5b2f3ad3ad773d7 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Thu, 28 Apr 2022 17:42:43 +0200 Subject: [PATCH 143/169] Lint fix, pretty fix, remove chr_names --- conf/modules.config | 12 +- docs/output.md | 112 +++++++++++------- docs/usage.md | 16 +-- modules/local/cutesv.nf | 4 +- modules/local/deepvariant.nf | 10 +- modules/local/get_chrom_names.nf | 26 ---- modules/local/medaka_variant.nf | 3 +- modules/local/pepper_margin_deepvariant.nf | 7 +- modules/local/sniffles.nf | 4 +- subworkflows/local/short_variant_calling.nf | 28 +---- .../local/structural_variant_calling.nf | 22 ---- workflows/nanoseq.nf | 35 +++--- 12 files changed, 118 insertions(+), 161 deletions(-) delete mode 100644 modules/local/get_chrom_names.nf diff --git a/conf/modules.config b/conf/modules.config index 2ff8a83a..fce0d3e3 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -152,7 +152,7 @@ if (!params.skip_alignment) { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', - enabled: true, + enabled: false, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } @@ -160,7 +160,15 @@ if (!params.skip_alignment) { publishDir = [ path: { "${params.outdir}/genome" }, mode: 'copy', - enabled: true, + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + withName: SAMTOOLS_FAIDX { + publishDir = [ + path: { "${params.outdir}/genome" }, + mode: 'copy', + enabled: false, saveAs: { filename -> filename.equals('versions.yml') ? null : filename } ] } diff --git a/docs/output.md b/docs/output.md index 61f12ad4..ad5d0ab6 100644 --- a/docs/output.md +++ b/docs/output.md @@ -4,7 +4,7 @@ ## Introduction -This document describes the output produced by the pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. +This document describes the output produced by the nf-core/nanoseq pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. ## Pipeline overview @@ -12,7 +12,7 @@ The pipeline is built using [Nextflow](https://www.nextflow.io/). See [`main REA See [Oxford NanoPore website](https://nanoporetech.com/) for more information regarding the sequencing technology, protocol, and for an extensive list of resources. -The directories listed below will be created in the output directory after the pipeline has finished. All paths are relative to the top-level results directory. +The directories listed below are created in the output directory after the pipeline has finished. All paths are relative to the top-level results directory. ## Basecalling and demultiplexing @@ -22,9 +22,9 @@ The directories listed below will be created in the output directory after the p - `guppy/fastq/` Merged fastq output files for each barcode. - `guppy/basecalling//` - fastq output files for each barcode. + FASTQ output files for each barcode. - `guppy/basecalling/unclassified/` - fastq files with reads were unassigned to any given barcode. + FASTQ files with reads were unassigned to any given barcode. - `guppy/basecalling/sequencing_summary.txt` Sequencing summary file generated by _Guppy_. - `guppy/basecalling/sequencing_telemetry.js` @@ -36,9 +36,9 @@ The directories listed below will be created in the output directory after the p - `demux_fast5/demultiplexed_fast5/unclassified/` fast5 files with reads were unassigned to any given barcode. - `qcat/fastq/.fastq.gz` - fastq output files for each barcode. + FASTQ output files for each barcode. - `qcat/fastq/none.fastq.gz` - fastq file with reads were unassigned to any given barcode. + FASTQ file with reads were unassigned to any given barcode. @@ -46,13 +46,7 @@ _Documentation_: [Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux_fast5](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) _Description_: -The pipeline has been written to deal with the various scenarios where you would like to include/exclude the basecalling and demultiplexing steps. This will be dependent on what type of input data you would like to provide the pipeline. Additionally, if you would like to align your samples to a reference genome there are various options for providing this information. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet, associated commands and how to provide reference genome data. - -_Guppy_ will be used to basecall and demultiplex the data. Various options have been provided to customise specific parameters and to be able to run _Guppy_ on GPUs. - -_demux_fast5_ will demultiplex the fast5 files, gives the _Guppy_ summary file. - -If you have a pre-basecalled fastq file then _qcat_ will be used to perform the demultiplexing if you provide the `--skip_basecalling` parameter. If you would like to skip both of these steps entirely then you can provide `--skip_basecalling --skip_demultiplexing` when running the pipeline. As a result, the structure of the output folder will depend on which steps you have chosen to run in the pipeline. +Nanoseq is designed to deal with various input data types. _Guppy_ can be used to basecall raw data which can then be demultiplexed using _demux_fast5_. Alternatively, _demux_fast5_ can be used to demultiplex FAST5 data that has already been basecalled. Various options are available to customising these steps, including running _Guppy_ on GPUs if they are available. If you already have a pre-basecalled FASTQ file then _qcat_ can used to perform demultiplexing. The `--skip_basecalling` and `--skip_demultiplexing` parameters can be used seperately or together to skip steps depending on your input data type. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet. The structure of the output folder will depend on the steps you have chosen to run in the pipeline. ## Removal of DNA contaminants @@ -60,7 +54,7 @@ If you have a pre-basecalled fastq file then _qcat_ will be used to perform the

Output files - `nanolyse/.clean.fastq.gz` - FastQ file after the removal of reads mapping to DNA contaminants. + FASTQ files after the removal of reads mapping to DNA contaminants. @@ -68,7 +62,7 @@ _Documentation_: [NanoLyse](https://github.com/wdecoster/nanolyse) _Description_: -If you would like to run NanoLyse on the raw FastQ files then you can provide `--run_nanolyse` when running the pipeline. By default, the pipeline will filter the raw reads relative to lambda phage but you can provide your own fasta file of "contaminants" with `--nanolyse_fasta`. The filtered FastQ files will contain raw reads without the provided reference sequences (default: lambda phage sequences). +If you would like to run NanoLyse on the raw FASTQ files then you can provide `--run_nanolyse` when running the pipeline. By default, the pipeline will filter lambda phage reads but you can provide your own fasta file of "contaminants" with `--nanolyse_fasta`. The filtered FASTQ files will contain raw reads without the specified reference sequences (default: lambda phage sequences). ## Sequencing QC @@ -76,9 +70,9 @@ If you would like to run NanoLyse on the raw FastQ files then you can provide `- Output files - `pycoqc/pycoqc.html` - `*.html` file that includes a run summary and graphical representation of various QC metrics including distribution of read length, distribution of read quality scores, mean read quality per sequence length, output per channel over experiment time and percentage of reads per barcode. + `*.html` file that contains a run summary and graphical representation of various QC metrics, including distribution of read length, distribution of read quality scores, mean read quality per sequence length, output per channel over experiment time, and percentage of reads per barcode. - `nanoplot/summary/` - `*.html` files for QC metrics and individual `*.png` image files for plots. + `*.html` files for QC metrics and an individual `*.png` image file for each plot. @@ -86,7 +80,7 @@ _Documentation_: [PycoQC](https://github.com/a-slide/pycoQC), [NanoPlot](https://github.com/wdecoster/NanoPlot) _Description_: -_PycoQC_ and _NanoPlot_ compute metrics and generate QC plots using the sequencing summary information generated by _Guppy_ e.g. distribution of read length, read length over time, number of reads per barcode and other general stats. _NanoPlot_ also generates QC metrics directly from fastq files as described in the next section. +_PycoQC_ and _NanoPlot_ compute QC metrics and generate plots using the sequencing summary information generated by _Guppy_ e.g. distribution of read length, read length over time, number of reads per barcode and other general stats. _NanoPlot_ also generates QC metrics directly from FASTQ files as described in the next section. ![PycoQC - Number of reads per barcode](images/pycoqc_readsperbarcode.png) @@ -96,7 +90,7 @@ _PycoQC_ and _NanoPlot_ compute metrics and generate QC plots using the sequenci Output files - `nanoplot/fastq//` - Per-sample `*.html` files for QC metrics and individual `*.png` image files for plots. + Per-sample `*.html` files that contain QC metrics and individual `*.png` image files for plots. - `fastqc/` _FastQC_ `*.html` and `*.zip` files. @@ -106,7 +100,7 @@ _Documentation_: [NanoPlot](https://github.com/wdecoster/NanoPlot), [FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/) _Description_: -_NanoPlot_ can also be used to produce general quality metrics from the per-barcode fastq files generated by _Guppy_ e.g. quality score distribution, read lengths and other general stats. +_NanoPlot_ can also be used to produce general quality metrics from the per-barcode FASTQ files generated by _Guppy_ e.g. quality score distribution, read lengths and other general stats. ![Nanoplot - Read quality vs read length](images/nanoplot_readlengthquality.png) @@ -118,23 +112,23 @@ _FastQC_ gives general quality metrics about your reads. It provides information Output files - `/bam` - Per-sample coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. + Per-sample coordinate sorted alignment file in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. - `/bam_index` - Per-sample coordinate sorted alignment index files in [`*.bai`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. + Per-sample coordinate sorted alignment index file in [`*.bai`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. - `/samtools_stats/` - _SAMtools_ `*.flagstat`, `*.idxstats` and `*.stats` files generated from the alignment files. + _Samtools_ `*.flagstat`, `*.idxstats` and `*.stats` file generated from the alignment file. _Documentation_: -[GraphMap2](https://github.com/lbcb-sci/graphmap2), [MiniMap2](https://github.com/lh3/minimap2), [SAMtools](http://samtools.sourceforge.net/) +[GraphMap2](https://github.com/lbcb-sci/graphmap2), [MiniMap2](https://github.com/lh3/minimap2), [Samtools](http://samtools.sourceforge.net/) _Description_: -Reads are mapped to a user-defined genome or transcriptome using either _GraphMap2_ or _Minimap2_, and the resulting BAM files are sorted and indexed. If the same reference is specified multiple times in the input sample sheet then the aligner index will only be built once for re-use across all samples. You can skip the alignment and downstream processes by providing the `--skip_alignment` parameter. +Reads are mapped to a user-defined genome or transcriptome using either _GraphMap2_ or _Minimap2_, and the resulting BAM file is sorted and indexed. If the same reference is specified multiple times in the input sample sheet then the aligner index will only be built once for re-use across all samples. You can skip the alignment and downstream processes by providing the `--skip_alignment` parameter. -The initial SAM alignment files created by _GraphMap2_ or _Minimap2_ are not saved by default to be more efficient with storage space. You can override this behaviour with the use of the `--save_align_intermeds` parameter. +The initial SAM alignment file created by _GraphMap2_ or _Minimap2_ are not saved by default to be more efficient with storage space. You can override this behaviour with the use of the `--save_align_intermeds` parameter. -![MultiQC - SAMtools stats plot](images/mqc_samtools_stats_plot.png) +![MultiQC - Samtools stats plot](images/mqc_samtools_stats_plot.png) ## Coverage tracks @@ -142,9 +136,9 @@ The initial SAM alignment files created by _GraphMap2_ or _Minimap2_ are not sav Output files - `/bigwig/` - Per-sample `*.bigWig` files. + Per-sample `*.bigWig` file. - `/bigbed/` - Per-sample `*.bigBed` files. + Per-sample `*.bigBed` file. @@ -152,29 +146,65 @@ _Documentation_: [BEDTools](https://bedtools.readthedocs.io/en/latest/), [bedGraphToBigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html#Ex3), [`bedToBigBed`](https://genome.ucsc.edu/goldenPath/help/bigBed.html#Ex2) _Description_: -The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in an indexed binary format useful for displaying dense, continuous data in Genome Browsers such as the [UCSC](https://genome.ucsc.edu/cgi-bin/hgTracks) and [IGV](http://software.broadinstitute.org/software/igv/). This mitigates the need to load the much larger BAM files for data visualisation purposes which will be slower and result in memory issues. The bigWig format is also supported by various bioinformatics software for downstream processing such as meta-profile plotting. +The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in an indexed binary format useful for displaying dense, continuous data in Genome Browsers such as the [UCSC](https://genome.ucsc.edu/cgi-bin/hgTracks) and [IGV](http://software.broadinstitute.org/software/igv/). This mitigates the need to load the much larger BAM file for data visualisation purposes which will be slower and result in memory issues. The bigWig format is also supported by various bioinformatics software for downstream processing such as meta-profile plotting. [bigBed](https://genome.ucsc.edu/goldenPath/help/bigBed.html) are more useful for displaying distribution of reads across exon intervals as is typically observed for RNA-seq data. Therefore, these files will only be generated if `--protocol directRNA` or `--protocol cDNA` are defined. -The creation of these files can be bypassed by setting the parameters `--skip_bigwig`/`--skip_bigbed`. +The creation of these bigwig and bigbed files can be bypassed by setting the parameters `--skip_bigwig` and `--skip_bigbed`, respectively. ## Variant calling
Output files -- `minimap2/medaka//round_1.vcf` - VCF file with small variants for each sample. -- `minimap2/sniffles/_sniffles.vcf` - VCF files with unflitered structural variants. +Short variant callers + +- Medaka: + + - `variant_calling/medaka//round_1.vcf` + VCF file with small variants for each sample. + - `variant_calling/sniffles/_sniffles.vcf` + VCF file with unflitered structural variants. + +- DeepVariant: + + - `variant_calling/deepvariant/.vcf.gz` + Zipped VCF file with small variants. + - `variant_calling/deepvariant/.vcf.gz.tbi` + Index for zipped VCF file with small variants. + +- PEPPER-Margin-DeepVariant: + - `variant_calling/deepvariant/.vcf.gz` + Zipped VCF file with small variants. + - `variant_calling/deepvariant/.vcf.gz.tbi` + Index for zipped VCF file with small variants. + +Structural variant callers + +- Sniffles + + - `variant_calling/cutesv/.vcf.gz` + Zipped VCF file with smtructural variants. + - `variant_calling/cutesv/.vcf.gz.tbi` + Index for zipped VCF file with structural variants. + +- cuteSV + - `variant_calling/sniffles/.vcf.gz` + Zipped VCF file with smtructural variants. + - `variant_calling/sniffles/.vcf.gz.tbi` + Index for zipped VCF file with structural variants.
_Documentation_: -[Medaka](https://github.com/nanoporetech/medaka), [Sniffles](https://github.com/fritzsedlazeck/Sniffles) +[Medaka](https://github.com/nanoporetech/medaka), [DeepVariant](https://github.com/google/deepvariant), [PEPPER-Margin-DeepVariant](https://github.com/kishwarshafin/pepper), +[Sniffles](https://github.com/fritzsedlazeck/Sniffles), [cuteSV](https://github.com/tjiangHIT/cuteSV) _Description_: -If the protocol is set to `--protocol DNA` and the _Minimap2_ aligner was used, then the `--call_variants` parameter can be invoked to call small variants and structural variants using Medaka and Sniffles, respectively. These steps won't be run if you provide the `--skip_medaka` or `--skip_sniffles` parameters. +If the `--protocol DNA` and the `--call_variants` parameters are defined small and structural variants. +Short variants can be called using _medaka_, _deepvariant_ or _pepper_margin_deepvariant_. The short variant caller is specified using the `--variant_caller` parameter. +Structural variants can be called using either _cuteSV_ or _sniffles_. The structural variant caller is specified using the `--structural_variant_caller` parameter. +The short variant and/or structural variant calling steps is skipped if using the `--skip_vc` and `--skip_sniffles` flags. ## Transcript Reconstruction and Quantification @@ -192,11 +222,11 @@ If StringTie2 is used: - `stringtie2/` - `*.bam` - Per-sample coordinate sorted alignment files in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. + Per-sample coordinate sorted alignment file in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. - `*.stringtie.gtf` Per-sample annotations for novel transcripts obtained in _StringTie2_. - `stringtie.merged.gtf` - Extended annotation that combines provided gtf with gtf files from each sample via _StringTie2 Merge_. + Extended annotation that combines provided gtf with gtf file from each sample via _StringTie2 Merge_. - `counts_gene.txt` - gene expression estimates calculated by featureCounts. - `counts_gene.txt.summary` - featureCounts gene level log file. - `counts_transcript.txt` - transcript expression estimates calculated by featureCounts. @@ -287,8 +317,8 @@ The pipeline has special steps which also allow the software versions to be repo - `pipeline_info/` - Reports generated by Nextflow: `execution_report.html`, `execution_timeline.html`, `execution_trace.txt` and `pipeline_dag.dot`/`pipeline_dag.svg`. - - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` files will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. - - Reformatted samplesheet files used as input to the pipeline: `samplesheet.valid.csv`. + - Reports generated by the pipeline: `pipeline_report.html`, `pipeline_report.txt` and `software_versions.yml`. The `pipeline_report*` file will only be present if the `--email` / `--email_on_fail` parameter's are used when running the pipeline. + - Reformatted samplesheet file used as the pipeline input: `samplesheet.valid.csv`. diff --git a/docs/usage.md b/docs/usage.md index 77779ce4..2c2f0843 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -8,14 +8,14 @@ You will need to create a file with information about the samples in your experiment/run before executing the pipeline. Use the `--input` parameter to specify its location. It has to be a comma-separated file with 6 columns and a header row: -| Column | Description | -| --------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `group` | Group identifier for sample. This will be identical for replicate samples from the same experimental group. | -| `replicate` | Integer representing replicate number. Must start from `1..`. | -| `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | -| `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam" | -| `fasta` | Genome fasta file or transcriptome fasta file for alignment. This can either be a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | -| `gtf` | Annotation gtf file for transcript discovery and quantification and RNA modification detection. This can either be blank or a local path. Must have the extension ".gtf". | +| Column | Description | +| ------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `group` | Group identifier for sample. This will be identical for replicate samples from the same experimental group. | +| `replicate` | Integer representing replicate number. Must start from `1..`. | +| `barcode` | Barcode identifier attributed to that sample during multiplexing. Must be an integer. | +| `input_file` | Full path to FastQ file if previously demultiplexed, BAM file if previously aligned, or a path to a directory with subdirectories containing fastq or fast5 files. FastQ file has to be zipped and have the extension ".fastq.gz" or ".fq.gz". BAM file has to have the extension ".bam". | +| `fasta` | Genome fasta file or transcriptome fasta file for alignment. This can either be a local path, or the appropriate key for a genome available in [iGenomes config file](../conf/igenomes.config). Must have the extension ".fasta", ".fasta.gz", ".fa" or ".fa.gz". | +| `gtf` | Annotation gtf file for transcript discovery and quantification and RNA modification detection. This can either be blank or a local path. Must have the extension ".gtf". | ### Skip basecalling/demultiplexing diff --git a/modules/local/cutesv.nf b/modules/local/cutesv.nf index 992ee1fc..cd006559 100644 --- a/modules/local/cutesv.nf +++ b/modules/local/cutesv.nf @@ -8,7 +8,7 @@ process CUTESV { 'quay.io/biocontainers/cutesv:1.0.12--pyhdfd78af_0' }" input: - tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) + tuple val(meta), path(sizes), val(is_transcripts), path(input), path(index) path(fasta) output: @@ -18,7 +18,7 @@ process CUTESV { script: """ cuteSV \ - ${bam} \ + ${input} \ ${fasta} \ ${meta.id}_cuteSV.vcf \ . \ diff --git a/modules/local/deepvariant.nf b/modules/local/deepvariant.nf index 83f9172e..ca97ece6 100644 --- a/modules/local/deepvariant.nf +++ b/modules/local/deepvariant.nf @@ -2,17 +2,12 @@ process DEEPVARIANT { tag "$meta.id" label 'process_high' - - if (params.enable_conda) { - exit 1, "Conda environments cannot be used when using the DeepVariant tool. Please use docker or singularity containers." - } - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'docker.io/google/deepvariant:1.3.0' : 'docker.io/google/deepvariant:1.3.0' }" input: - tuple val(meta), path(input), path(index), val(intervals) + tuple val(meta), path(sizes), val(is_transcripts), path(input), path(index) path(fasta) path(fai) @@ -27,7 +22,7 @@ process DEEPVARIANT { script: def args = task.ext.args ?: '' prefix = task.ext.prefix ?: "${meta.id}" - def regions = intervals ? "--regions ${intervals}" : "" + //def regions = intervals ? "--regions ${intervals}" : "" """ /opt/deepvariant/bin/run_deepvariant \\ @@ -36,7 +31,6 @@ process DEEPVARIANT { --output_vcf=${prefix}.vcf.gz \\ --output_gvcf=${prefix}.g.vcf.gz \\ ${args} \\ - ${regions} \\ --num_shards=${task.cpus} cat <<-END_VERSIONS > versions.yml diff --git a/modules/local/get_chrom_names.nf b/modules/local/get_chrom_names.nf deleted file mode 100644 index b188a0cd..00000000 --- a/modules/local/get_chrom_names.nf +++ /dev/null @@ -1,26 +0,0 @@ -process GET_CHROM_NAMES { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::samtools=1.10" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.13--h8c37831_0' : - 'quay.io/biocontainers/samtools:1.13--h8c37831_0' }" - - input: - tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) - - output: - path "chrom.names" , emit: chrom_names - path "versions.yml" , emit: versions - - script: - """ - samtools idxstats $bam | cut -f 1 | head -n -1 > chrom.names - - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/medaka_variant.nf b/modules/local/medaka_variant.nf index 153fc21c..c140b13c 100644 --- a/modules/local/medaka_variant.nf +++ b/modules/local/medaka_variant.nf @@ -8,7 +8,7 @@ process MEDAKA_VARIANT { 'quay.io/biocontainers/medaka:1.4.4--py38h130def0_0' }" input: - tuple val(meta), path(input), path(index), val(intervals) + tuple val(meta), path(sizes), val(is_transcripts), path(input), path(index) path(fasta) output: @@ -30,7 +30,6 @@ process MEDAKA_VARIANT { -i $input \\ -o $output_dir \\ -t $task.cpus \\ - -r $meta.chr \\ $split_mnps \\ $phase_vcf diff --git a/modules/local/pepper_margin_deepvariant.nf b/modules/local/pepper_margin_deepvariant.nf index 8d307a79..fce32770 100644 --- a/modules/local/pepper_margin_deepvariant.nf +++ b/modules/local/pepper_margin_deepvariant.nf @@ -2,17 +2,12 @@ process PEPPER_MARGIN_DEEPVARIANT { tag "$meta.id" label 'process_high' - - if (params.enable_conda) { - exit 1, "Conda environments cannot be used when using the PEPPER_MARGIN_DEEPVARIANT tool. Please use docker or singularity containers." - } - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? 'docker.io/kishwars/pepper_deepvariant:r0.8' : 'docker.io/kishwars/pepper_deepvariant:r0.8' }" input: - tuple val(meta), path(input), path(index), val(intervals) + tuple val(meta), path(sizes), val(is_transcripts), path(input), path(index) path(fasta) path(fai) diff --git a/modules/local/sniffles.nf b/modules/local/sniffles.nf index 52677420..17154c47 100644 --- a/modules/local/sniffles.nf +++ b/modules/local/sniffles.nf @@ -8,7 +8,7 @@ process SNIFFLES { 'quay.io/biocontainers/sniffles:1.0.12--h8b12597_1' }" input: - tuple val(meta), path(sizes), val(is_transcripts), path(bam), path(bai) + tuple val(meta), path(sizes), val(is_transcripts), path(input), path(index) output: @@ -19,7 +19,7 @@ process SNIFFLES { script: """ sniffles \ - -m $bam \ + -m $input \ -v ${meta.id}_sniffles.vcf \ -t $task.cpus diff --git a/subworkflows/local/short_variant_calling.nf b/subworkflows/local/short_variant_calling.nf index 4d65e9b0..bb2b3cab 100644 --- a/subworkflows/local/short_variant_calling.nf +++ b/subworkflows/local/short_variant_calling.nf @@ -2,7 +2,6 @@ * Short variant calling test */ -include { GET_CHROM_NAMES } from '../../modules/local/get_chrom_names' include { MEDAKA_VARIANT } from '../../modules/local/medaka_variant' include { TABIX_BGZIP as MEDAKA_BGZIP_VCF } from '../../modules/nf-core/modules/tabix/bgzip/main' include { TABIX_TABIX as MEDAKA_TABIX_VCF } from '../../modules/nf-core/modules/tabix/tabix/main' @@ -25,27 +24,6 @@ workflow SHORT_VARIANT_CALLING { ch_short_calls_gvcf_tbi = Channel.empty() ch_versions = Channel.empty() - /* - * Get chromosomes from bam file for splitting calling - */ - GET_CHROM_NAMES( ch_view_sortbam ) - ch_chrom_names = GET_CHROM_NAMES.out.chrom_names - - /* - * Map chromosome names - */ - ch_chrom_names - .splitCsv() - .combine( ch_view_sortbam ) - .unique() - .map { chroms, meta, sizes, is_transcripts, bam, bai -> - new_meta = meta.clone() - new_meta.id = meta.id + "_" + chroms - new_meta.sample = meta.id - new_meta.chr = chroms - [new_meta, bam, bai, chroms] - }.set { ch_view_sortbam_split } - /* * Call short variants */ @@ -54,7 +32,7 @@ workflow SHORT_VARIANT_CALLING { /* * Call short variants with medaka */ - MEDAKA_VARIANT( ch_view_sortbam_split, ch_fasta ) + MEDAKA_VARIANT( ch_view_sortbam, ch_fasta ) ch_versions = ch_versions.mix(medaka_version = MEDAKA_VARIANT.out.versions) /* @@ -76,7 +54,7 @@ workflow SHORT_VARIANT_CALLING { /* * Call variants with deepvariant */ - DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) + DEEPVARIANT( ch_view_sortbam, ch_fasta, ch_fai ) ch_short_calls_vcf = DEEPVARIANT.out.vcf ch_short_calls_gvcf = DEEPVARIANT.out.gvcf ch_versions = ch_versions.mix(DEEPVARIANT.out.versions) @@ -100,7 +78,7 @@ workflow SHORT_VARIANT_CALLING { /* * Call variants with pepper_margin_deepvariant (automatic zip + index, docker + singularity only) */ - PEPPER_MARGIN_DEEPVARIANT( ch_view_sortbam_split, ch_fasta, ch_fai ) + PEPPER_MARGIN_DEEPVARIANT( ch_view_sortbam, ch_fasta, ch_fai ) ch_short_calls_vcf = PEPPER_MARGIN_DEEPVARIANT.out.vcf ch_short_calls_vcf_tbi = PEPPER_MARGIN_DEEPVARIANT.out.tbi ch_versions = ch_versions.mix(PEPPER_MARGIN_DEEPVARIANT.out.versions) diff --git a/subworkflows/local/structural_variant_calling.nf b/subworkflows/local/structural_variant_calling.nf index 677737fe..ec84742d 100644 --- a/subworkflows/local/structural_variant_calling.nf +++ b/subworkflows/local/structural_variant_calling.nf @@ -2,7 +2,6 @@ * Structural variant calling */ -include { GET_CHROM_NAMES } from '../../modules/local/get_chrom_names' include { SNIFFLES } from '../../modules/local/sniffles' include { TABIX_BGZIP as SNIFFLES_BGZIP_VCF } from '../../modules/nf-core/modules/tabix/bgzip/main' include { TABIX_TABIX as SNIFFLES_TABIX_VCF } from '../../modules/nf-core/modules/tabix/tabix/main' @@ -24,27 +23,6 @@ workflow STRUCTURAL_VARIANT_CALLING { ch_versions = Channel.empty() - /* - * Get chromosomes from bam file for splitting calling - */ - GET_CHROM_NAMES( ch_view_sortbam ) - ch_chrom_names = GET_CHROM_NAMES.out.chrom_names - - /* - * Map chromosome names - */ - ch_chrom_names - .splitCsv() - .combine( ch_view_sortbam ) - .unique() - .map { chroms, meta, sizes, is_transcripts, bam, bai -> - new_meta = meta.clone() - new_meta.id = meta.id + "_" + chroms - new_meta.sample = meta.id - new_meta.chr = chroms - [new_meta, bam, bai, chroms] - }.set { ch_view_sortbam_split } - /* * Call structural variants with sniffles */ diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 3a847631..45c280d2 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -34,14 +34,11 @@ def isOffline() { def ch_guppy_model = Channel.empty() def ch_guppy_config = Channel.empty() -// Check protocol is a known type if (params.protocol != 'DNA' && params.protocol != 'cDNA' && params.protocol != 'directRNA') { exit 1, "Invalid protocol option: ${params.protocol}. Valid options: 'DNA', 'cDNA', 'directRNA'" } -// Check other parameters are sufficient/match if (!params.skip_basecalling) { - // Need to stage guppy_config properly depending on whether its a file or string if (!params.guppy_config) { if (!params.flowcell) { exit 1, "Please specify a valid flowcell identifier for basecalling!" } if (!params.kit) { exit 1, "Please specify a valid kit identifier for basecalling!" } @@ -49,7 +46,6 @@ if (!params.skip_basecalling) { ch_guppy_config = Channel.fromPath(params.guppy_config) } - // Need to stage guppy_model properly depending on whether its a file or string if (params.guppy_model) { if (file(params.guppy_model).exists()) { ch_guppy_model = Channel.fromPath(params.guppy_model) @@ -96,6 +92,9 @@ if (params.call_variants) { if (!params.skip_sv && params.structural_variant_caller != 'sniffles' && params.structural_variant_caller != 'cutesv') { exit 1, "Invalid structural variant caller option: ${params.structural_variant_caller}. Valid options: 'sniffles', 'cutesv" } + if (params.enable_conda && params.variant_caller != 'medaka') { + exit 1, "Conda environments cannot be used when using the deepvariant or pepper_margin_deepvariant tools. Valid options: 'docker', 'singularity'" + } } if (!params.skip_quantification) { @@ -363,20 +362,22 @@ workflow NANOSEQ{ ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.samtools_versions.first().ifEmpty(null)) ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) - /* - * SUBWORKFLOW: Short variant calling - */ - if (params.call_variants && params.protocol == 'DNA' && !params.skip_vc) { - SHORT_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) - ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) - } + if (params.call_variants && params.protocol == 'DNA') { + /* + * SUBWORKFLOW: Short variant calling + */ + if (!params.skip_vc) { + SHORT_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) + ch_software_versions = ch_software_versions.mix(SHORT_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) + } - /* - * SUBWORKFLOW: Structural variant calling - */ - if (params.call_variants && params.protocol == 'DNA' && !params.skip_sv) { - STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) - ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) + /* + * SUBWORKFLOW: Structural variant calling + */ + if (!params.skip_sv) { + STRUCTURAL_VARIANT_CALLING ( ch_view_sortbam, ch_fasta.map{ it [1] }, ch_fai.map{ it [1] } ) + ch_software_versions = ch_software_versions.mix(STRUCTURAL_VARIANT_CALLING.out.ch_versions.first().ifEmpty(null)) + } } ch_bedtools_version = Channel.empty() From ffe747d605dc1af7adb0018b83471cde9ac753b4 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 29 Apr 2022 13:50:09 +0200 Subject: [PATCH 144/169] Fix medaka folder output and updated output doc, changelong, and schema --- CHANGELOG.md | 32 ++--- conf/modules.config | 10 ++ docs/output.md | 160 +++++++++------------ modules/local/pepper_margin_deepvariant.nf | 6 +- nextflow_schema.json | 10 +- 5 files changed, 100 insertions(+), 118 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 543a06b2..6be07748 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,8 +23,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `--output_demultiplex_fast5` to output demultiplexed fast5 - Added `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq - Added `--call_variants` to detect DNA variants -- Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms -- Added `--phase_vcf` to output a phased vcf +- Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms when using medaka +- Added `--phase_vcf` to output a phased vcf when using medaka - Added `--skip_vc` to skip `variant_calling` - Added `--skip_sv` to skip `structural_variant_calling` - Added `--variant_caller` to specify variant caller. @@ -37,20 +37,20 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Software dependencies -| Dependency | Old version | New version | -| ----------------------- | ----------- | ----------- | -| `bioconductor-bambu` | 1.0.2 | 2.0.0 | -| `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | -| `cutesv` | | 1.0.12 | -| `deepvariant` | | 1.0.3 | -| `jaffa` | | 2.0 | -| `m6anet` | | 1.0 | -| `medaka` | | 1.4.4 | -| `multiqc` | 1.10.1 | 1.11 | -| `ont_fast5_api` | | 4.0.0 | -| `pepper_deepvariant` | | 0.8 | -| `sniffles` | | 1.0.12 | -| `xpore` | | 2.1 | +| Dependency | Old version | New version | +| --------------------------- | ----------- | ----------- | +| `bioconductor-bambu` | 1.0.2 | 2.0.0 | +| `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | +| `cutesv` | | 1.0.12 | +| `deepvariant` | | 1.0.3 | +| `jaffa` | | 2.0 | +| `m6anet` | | 1.0 | +| `medaka` | | 1.4.4 | +| `multiqc` | 1.10.1 | 1.11 | +| `ont_fast5_api` | | 4.0.0 | +| `pepper_margin_deepvariant` | | 0.8 | +| `sniffles` | | 1.0.12 | +| `xpore` | | 2.1 | ### Bug fix diff --git a/conf/modules.config b/conf/modules.config index fce0d3e3..5d8f818a 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -429,6 +429,16 @@ if (params.call_variants) { if (params.variant_caller == 'medaka') { process { withName: MEDAKA_VARIANT { + publishDir = [ + path: { "${params.outdir}/variant_calling/medaka_variant" }, + mode: 'copy', + enabled: false, + saveAs: { filename -> filename.equals('versions.yml') ? null : filename } + ] + } + } + process { + withName: MEDAKA_BGZIP_VCF { publishDir = [ path: { "${params.outdir}/variant_calling/medaka_variant" }, mode: 'copy', diff --git a/docs/output.md b/docs/output.md index ad5d0ab6..056820b9 100644 --- a/docs/output.md +++ b/docs/output.md @@ -4,13 +4,13 @@ ## Introduction -This document describes the output produced by the nf-core/nanoseq pipeline. Most of the plots are taken from the MultiQC report, which summarises results at the end of the pipeline. +This document describes the output produced by the nf-core/nanoseq pipeline. Most of the plots shown here are taken from the MultiQC report, which summarises the pipeline results. ## Pipeline overview -The pipeline is built using [Nextflow](https://www.nextflow.io/). See [`main README.md`](../README.md) for a condensed overview of the steps in the pipeline, and the bioinformatics tools used at each step. +The nf-core/nanoseq pipeline is built using [Nextflow](https://www.nextflow.io/). There are many different potential outputs for the pipeline depending on what file inputs and parameters you use. Please see [`main README.md`](../README.md) for a condensed overview of the steps in the pipeline, and the bioinformatics tools used at each step. -See [Oxford NanoPore website](https://nanoporetech.com/) for more information regarding the sequencing technology, protocol, and for an extensive list of resources. +See [Oxford NanoPore website](https://nanoporetech.com/) for more information regarding the sequencing technology, protocol, and for an extensive list of additional resources. The directories listed below are created in the output directory after the pipeline has finished. All paths are relative to the top-level results directory. @@ -19,42 +19,34 @@ The directories listed below are created in the output directory after the pipel
Output files -- `guppy/fastq/` - Merged fastq output files for each barcode. -- `guppy/basecalling//` - FASTQ output files for each barcode. -- `guppy/basecalling/unclassified/` - FASTQ files with reads were unassigned to any given barcode. -- `guppy/basecalling/sequencing_summary.txt` - Sequencing summary file generated by _Guppy_. -- `guppy/basecalling/sequencing_telemetry.js` - Sequencing telemetry file generated by _Guppy_. -- `guppy/basecalling/guppy_basecaller_log-.log` - Log file for _Guppy_ execution. -- `demux_fast5/demultiplexed_fast5//` - fast5 output files for each barcode. -- `demux_fast5/demultiplexed_fast5/unclassified/` - fast5 files with reads were unassigned to any given barcode. -- `qcat/fastq/.fastq.gz` - FASTQ output files for each barcode. -- `qcat/fastq/none.fastq.gz` - FASTQ file with reads were unassigned to any given barcode. +- `guppy/fastq/.fastq.gz`: merged FASTQ output files for each barcode. +- `guppy/basecalling/pass//.fastq.gz`: passing FASTQ output file for each barcode. +- `guppy/basecalling/pass/unclassified/.fastq.gz`: passing FASTQ files with reads were unassigned to any given barcode. +- `guppy/basecalling/fail//.fastq.gz`: failing FASTQ output file for each barcode. +- `guppy/basecalling/fail/unclassified/.fastq.gz`: failing FASTQ files with reads were unassigned to any given barcode. +- `guppy/basecalling/sequencing_summary.txt`: sequencing summary file generated by _Guppy_. +- `guppy/basecalling/sequencing_telemetry.js`: sequencing telemetry file generated by _Guppy_. +- `guppy/basecalling/guppy_basecaller_log-.log`: log file generated by _Guppy_. +- `demux_fast5/demultiplexed_fast5//`: directory containing `.fast5` and `.txt` file for each barcode. +- `demux_fast5/demultiplexed_fast5/unclassified/`: directory containing `.fast5` and `.txt` file for reads that were not unassigned to any given barcode. +- `qcat/fastq/.fastq.gz`: FASTQ output files for each barcode. +- `qcat/fastq/none.fastq.gz`: FASTQ file with reads were unassigned to any given barcode.
_Documentation_: -[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux_fast5](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) +[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) _Description_: -Nanoseq is designed to deal with various input data types. _Guppy_ can be used to basecall raw data which can then be demultiplexed using _demux_fast5_. Alternatively, _demux_fast5_ can be used to demultiplex FAST5 data that has already been basecalled. Various options are available to customising these steps, including running _Guppy_ on GPUs if they are available. If you already have a pre-basecalled FASTQ file then _qcat_ can used to perform demultiplexing. The `--skip_basecalling` and `--skip_demultiplexing` parameters can be used seperately or together to skip steps depending on your input data type. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet. The structure of the output folder will depend on the steps you have chosen to run in the pipeline. +Nanoseq is designed to deal with various input data types. _Guppy_ can be used to basecall raw data which can then be demultiplexed using _demux_. Alternatively, _demux_ can be used to demultiplex FAST5 data that has already been basecalled. Various options are available to customising these steps, including running _Guppy_ on GPUs if they are available. If you already have a pre-basecalled FASTQ file then _qcat_ can used to perform demultiplexing. The `--skip_basecalling` and `--skip_demultiplexing` parameters can be used seperately or together to skip steps depending on your input data type. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet. All potential outputs are shown here however some may not be produced depending on your inputs and the steps you have chosen to run. ## Removal of DNA contaminants
Output files -- `nanolyse/.clean.fastq.gz` - FASTQ files after the removal of reads mapping to DNA contaminants. +- `nanolyse/.fastq.gz`: FASTQ file after the removal of reads that map to DNA contaminants. +- `nanolyse/.nanolyse.log`: NanoLyse log file.
@@ -62,17 +54,16 @@ _Documentation_: [NanoLyse](https://github.com/wdecoster/nanolyse) _Description_: -If you would like to run NanoLyse on the raw FASTQ files then you can provide `--run_nanolyse` when running the pipeline. By default, the pipeline will filter lambda phage reads but you can provide your own fasta file of "contaminants" with `--nanolyse_fasta`. The filtered FASTQ files will contain raw reads without the specified reference sequences (default: lambda phage sequences). +If you would like to run NanoLyse on the raw FASTQ files you can provide `--run_nanolyse` when running the pipeline. By default, the pipeline will filter lambda phage reads, however you can provide your own FASTA file of "contaminants" with `--nanolyse_fasta`. The filtered FASTQ files will contain raw reads without the specified reference sequences (default: lambda phage sequences). ## Sequencing QC
Output files -- `pycoqc/pycoqc.html` - `*.html` file that contains a run summary and graphical representation of various QC metrics, including distribution of read length, distribution of read quality scores, mean read quality per sequence length, output per channel over experiment time, and percentage of reads per barcode. -- `nanoplot/summary/` - `*.html` files for QC metrics and an individual `*.png` image file for each plot. +- `pycoqc/pyoqc.html`: HTML file that contains a run summary and graphical representation of various QC metrics. +- `pycoqc/pyoqc.json`: JSON formatted file containing QC data shown in the HTML report. +- `nanoplot/summary/`: directory with various `*.html` files showing QC metrics and a single _NanoPlot_ `.log` file.
@@ -80,7 +71,7 @@ _Documentation_: [PycoQC](https://github.com/a-slide/pycoQC), [NanoPlot](https://github.com/wdecoster/NanoPlot) _Description_: -_PycoQC_ and _NanoPlot_ compute QC metrics and generate plots using the sequencing summary information generated by _Guppy_ e.g. distribution of read length, read length over time, number of reads per barcode and other general stats. _NanoPlot_ also generates QC metrics directly from FASTQ files as described in the next section. +_PycoQC_ and _NanoPlot_ can compute QC metrics and generate plots using the sequencing summary information generated by _Guppy_ e.g. distribution of read length, read length over time, number of reads per barcode and other general stats. _NanoPlot_ can also generates QC metrics directly from FASTQ files as described in the next section. ![PycoQC - Number of reads per barcode](images/pycoqc_readsperbarcode.png) @@ -89,10 +80,9 @@ _PycoQC_ and _NanoPlot_ compute QC metrics and generate plots using the sequenci
Output files -- `nanoplot/fastq//` - Per-sample `*.html` files that contain QC metrics and individual `*.png` image files for plots. -- `fastqc/` - _FastQC_ `*.html` and `*.zip` files. +- `nanoplot/fastq//`: directory with various `*.html` files containing QC metrics and plots. +- `fastqc/_fastqc.html`: _FastQC_ `*.html` file for each sample. +- `fastqc/_fastqc.zip`: _FastQC_ `*.zip` file for each sample.
@@ -100,23 +90,20 @@ _Documentation_: [NanoPlot](https://github.com/wdecoster/NanoPlot), [FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/) _Description_: -_NanoPlot_ can also be used to produce general quality metrics from the per-barcode FASTQ files generated by _Guppy_ e.g. quality score distribution, read lengths and other general stats. +_NanoPlot_ can be used to produce general quality metrics from the per barcode FASTQ files generated by _Guppy_ e.g. quality score distribution, read lengths and other general stats. ![Nanoplot - Read quality vs read length](images/nanoplot_readlengthquality.png) -_FastQC_ gives general quality metrics about your reads. It provides information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). You get information about adapter contamination and other overrepresented sequences. +_FastQC_ can give general quality metrics about your reads. It can provide information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). You can also generate information about adapter contamination and other over-represented sequences. ## Alignment
Output files -- `/bam` - Per-sample coordinate sorted alignment file in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. -- `/bam_index` - Per-sample coordinate sorted alignment index file in [`*.bai`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. -- `/samtools_stats/` - _Samtools_ `*.flagstat`, `*.idxstats` and `*.stats` file generated from the alignment file. +- `/.sorted.bam`: per sample coordinate sorted BAM file. +- `/.sorted.bam.bai`: per sample coordinate sorted BAM index file. +- `/samtools_stats/`: directory with per sample `*.flagstat`, `*.idxstats` and `*.stats` files generated by _Samtools_.
@@ -124,9 +111,9 @@ _Documentation_: [GraphMap2](https://github.com/lbcb-sci/graphmap2), [MiniMap2](https://github.com/lh3/minimap2), [Samtools](http://samtools.sourceforge.net/) _Description_: -Reads are mapped to a user-defined genome or transcriptome using either _GraphMap2_ or _Minimap2_, and the resulting BAM file is sorted and indexed. If the same reference is specified multiple times in the input sample sheet then the aligner index will only be built once for re-use across all samples. You can skip the alignment and downstream processes by providing the `--skip_alignment` parameter. +Reads are mapped to a user-defined genome or transcriptome using either _GraphMap2_ or _Minimap2_. The resulting BAM file is sorted and indexed using _Samtools_. If the same reference is specified multiple times in the input sample sheet then the aligner index will only be built once for re-use across all samples. You can skip the alignment and downstream processes by providing the `--skip_alignment` parameter. -The initial SAM alignment file created by _GraphMap2_ or _Minimap2_ are not saved by default to be more efficient with storage space. You can override this behaviour with the use of the `--save_align_intermeds` parameter. +The initial SAM alignment file created by _GraphMap2_ or _Minimap2_ are not saved by default to be more storage space efficient. You can override this behaviour by using the `--save_align_intermeds` parameter. ![MultiQC - Samtools stats plot](images/mqc_samtools_stats_plot.png) @@ -135,10 +122,8 @@ The initial SAM alignment file created by _GraphMap2_ or _Minimap2_ are not save
Output files -- `/bigwig/` - Per-sample `*.bigWig` file. -- `/bigbed/` - Per-sample `*.bigBed` file. +- `/bigwig/`: directory with per sample `*.bigWig` and `*.bedGraph` file. +- `/bigbed/`: directory with per sample `*.bigBed` and `*bed12` file.
@@ -150,7 +135,7 @@ The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in a [bigBed](https://genome.ucsc.edu/goldenPath/help/bigBed.html) are more useful for displaying distribution of reads across exon intervals as is typically observed for RNA-seq data. Therefore, these files will only be generated if `--protocol directRNA` or `--protocol cDNA` are defined. -The creation of these bigwig and bigbed files can be bypassed by setting the parameters `--skip_bigwig` and `--skip_bigbed`, respectively. +The creation of these bigwig and bigbed files can be bypassed by setting the `--skip_bigwig` and `--skip_bigbed` parameters, respectively. ## Variant calling @@ -161,38 +146,28 @@ Short variant callers - Medaka: - - `variant_calling/medaka//round_1.vcf` - VCF file with small variants for each sample. - - `variant_calling/sniffles/_sniffles.vcf` - VCF file with unflitered structural variants. + - `variant_calling/medaka_variant/.vcf.gz`: zipped VCF file with small variants. + - `variant_calling/medaka_variant/.vcf.gz`: index for zipped VCF file with small variants. - DeepVariant: - - `variant_calling/deepvariant/.vcf.gz` - Zipped VCF file with small variants. - - `variant_calling/deepvariant/.vcf.gz.tbi` - Index for zipped VCF file with small variants. + - `variant_calling/deepvariant/.vcf.gz`: zipped VCF file with small variants. + - `variant_calling/deepvariant/.vcf.gz.tbi`: index for zipped VCF file with small variants. - PEPPER-Margin-DeepVariant: - - `variant_calling/deepvariant/.vcf.gz` - Zipped VCF file with small variants. - - `variant_calling/deepvariant/.vcf.gz.tbi` - Index for zipped VCF file with small variants. + - `variant_calling/margin_pepper_deepvariant/.vcf.gz`: zipped VCF file with small variants. + - `variant_calling/margin_pepper_deepvariant/.vcf.gz.tbi`: index for zipped VCF file with small variants. Structural variant callers - Sniffles - - `variant_calling/cutesv/.vcf.gz` - Zipped VCF file with smtructural variants. - - `variant_calling/cutesv/.vcf.gz.tbi` - Index for zipped VCF file with structural variants. + - `variant_calling/cutesv/.vcf.gz`: zipped VCF file with smtructural variants. + - `variant_calling/cutesv/.vcf.gz.tbi`: index for zipped VCF file with structural variants. - cuteSV - - `variant_calling/sniffles/.vcf.gz` - Zipped VCF file with smtructural variants. - - `variant_calling/sniffles/.vcf.gz.tbi` - Index for zipped VCF file with structural variants. + - `variant_calling/sniffles/.vcf.gz`: zipped VCF file with smtructural variants. + - `variant_calling/sniffles/.vcf.gz.tbi`: index for zipped VCF file with structural variants. @@ -214,23 +189,20 @@ The short variant and/or structural variant calling steps is skipped if using th If bambu is used: - `bambu/` - - `extended_annotations.gtf` - a gtf file that contains both annotated and novel transcripts - - `counts_gene.txt` - gene expression estimates - - `counts_transcript.txt` - transcript expression estimates + - `extended_annotations.gtf`: a GTF file that contains both annotated and novel transcripts + - `counts_gene.txt`: a TXT file containing gene expression estimates + - `counts_transcript.txt`: a TXT file containing transcript expression estimates If StringTie2 is used: - `stringtie2/` - - `*.bam` - Per-sample coordinate sorted alignment file in [`*.bam`](https://samtools.github.io/hts-specs/SAMv1.pdf) format. - - `*.stringtie.gtf` - Per-sample annotations for novel transcripts obtained in _StringTie2_. - - `stringtie.merged.gtf` - Extended annotation that combines provided gtf with gtf file from each sample via _StringTie2 Merge_. - - `counts_gene.txt` - gene expression estimates calculated by featureCounts. - - `counts_gene.txt.summary` - featureCounts gene level log file. - - `counts_transcript.txt` - transcript expression estimates calculated by featureCounts. - - `counts_transcript.txt.summary` - featureCounts transcript level log file. + - `*.bam`: per sample coordinate sorted alignment file. + - `*.stringtie.gtf`: per sample annotations for novel transcripts obtained in _StringTie2_. + - `stringtie.merged.gtf`: extended annotation that combines provided GTF with GTF file from each sample via _StringTie2 Merge_. + - `counts_gene.txt`: gene expression estimates calculated by featureCounts. + - `counts_gene.txt.summary`: FeatureCounts gene level log file. + - `counts_transcript.txt`: transcript expression estimates calculated by featureCounts. + - `counts_transcript.txt.summary`: FeatureCounts transcript level log file. @@ -245,8 +217,8 @@ After genomic alignment, novel transcripts can be reconstructed using tools such
Output files -- `/deseq2/deseq2.results.txt` - a `.txt` file that contains differential expression results for genes. -- `/dexseq/dexseq.results.txt` - a `.txt` file that contains differential expression results for transcripts. +- `/deseq2/deseq2.results.txt`: a TXT file that contains differential gene expression. +- `/dexseq/dexseq.results.txt`: a TXT file that contains differential transcript expression.
@@ -254,15 +226,15 @@ _Documentation_: [DESeq2](https://bioconductor.org/packages/release/bioc/html/DESeq2.html), [DEXSeq](https://bioconductor.org/packages/release/bioc/html/DEXSeq.html) _Description_: -If multiple conditions and multiple replicates are available then the pipeline is able to run differential analysis on gene and transcripts with DESeq2 and DEXSeq, respectively. These steps won't be run if you provide the `--skip_quantification` or `--skip_differential_analysis` parameters or if all of the samples in the samplesheet don't have the same fasta and GTF reference files. +If multiple conditions and multiple replicates are available then the pipeline is able to run differential analysis on gene and transcripts with DESeq2 and DEXSeq, respectively. These steps won't be run if you provide the `--skip_quantification` or `--skip_differential_analysis` parameters or if all of the samples in the samplesheet don't have the same FASTA and GTF reference files. ## RNA modification analysis
Output files -- `rna_modifications/xpore/diffmod/diffmod_outputs/diffmod.table` - a `.csv` file that contains differentially modified sites. -- `rna_modifications/m6anet/inference//data.result.csv.gz` - a `.csv` file that contains detected m6A sites. +- `rna_modifications/xpore/diffmod/diffmod_outputs/diffmod.table`: a table file that contains differentially modified sites. +- `rna_modifications/m6anet/inference//data.result.csv.gz`: a CSV file that contains m6A sites.
@@ -277,8 +249,8 @@ If multiple conditions are available then the pipeline is able to run differenti
Output files -- `jaffal/jaffa_results.csv` - a `.csv` file that contains detected RNA fusion results. -- `jaffal/jaffa_results.fasta` - a `.fasta` file that contains the sequence of the detected RNA fusions. +- `jaffal/jaffa_results.csv`: a CSV file that contains RNA fusion results. +- `jaffal/jaffa_results.fasta`: a FASTA file that contains the sequence of the RNA fusions.
@@ -295,8 +267,8 @@ This step won't be run if you provide the `--skip_fusion_analysis` parameter. - `multiqc/` - `multiqc_report.html`: a standalone HTML file that can be viewed in your web browser. - - `multiqc_data/`: directory containing parsed statistics from the different tools used in the pipeline. - - `multiqc_plots/`: directory containing static images from the report in various formats. + - `multiqc_data/`: a directory containing parsed statistics from the different tools used in the pipeline. + - `multiqc_plots/`: a directory containing static images from the report in various formats. diff --git a/modules/local/pepper_margin_deepvariant.nf b/modules/local/pepper_margin_deepvariant.nf index fce32770..4bac464e 100644 --- a/modules/local/pepper_margin_deepvariant.nf +++ b/modules/local/pepper_margin_deepvariant.nf @@ -12,8 +12,8 @@ process PEPPER_MARGIN_DEEPVARIANT { path(fai) output: - tuple val(meta), path("${prefix}/*vcf.gz") , emit: vcf - tuple val(meta), path("${prefix}/*vcf.gz.tbi") , emit: tbi + tuple val(meta), path("*vcf.gz") , emit: vcf + tuple val(meta), path("*vcf.gz.tbi") , emit: tbi path "versions.yml" , emit: versions when: @@ -31,7 +31,7 @@ process PEPPER_MARGIN_DEEPVARIANT { run_pepper_margin_deepvariant call_variant \\ -b "${input}" \\ -f "${fasta}" \\ - -o "${prefix}" \\ + -o "." \\ -p "${prefix}" \\ -t ${task.cpus} \\ $args diff --git a/nextflow_schema.json b/nextflow_schema.json index 1ffa3c38..add4cec5 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -202,7 +202,7 @@ "variant_calling_options": { "title": "Variant calling options", "type": "object", - "description": "Options to adjust pameters and filtering criteria for DNA varinat calling.", + "description": "Options to adjust pameters for DNA varinat calling and structural variant calling.", "default": "", "fa_icon": "fas fa-align-center", "properties": { @@ -214,24 +214,24 @@ "variant_caller": { "type": "string", "default": "medaka", - "description": "Specifies the variant caller to be used to call small variants (available are: medaka). Only available '--call_variants' is set and the protocol is DNA.", + "description": "Specifies the variant caller that will used to call small variants (available are: medaka, deepvariant, and pepper_margin_deepvariant). Variant calling is only available if '--call_variants' is set and the protocol is set to `DNA`. Please note `deepvariant` and `pepper_margin_deepvariant` are only avaible if using singularity or docker.", "fa_icon": "fas fa-bezier-curve" }, "structural_variant_caller": { "type": "string", "default": "sniffles", - "description": "Specifies the variant caller to be used to call structural variants (available are: sniffles and cutesv). Only available '--call_variants' is set and the protocol is DNA.", + "description": "Specifies the variant caller that will be used to call structural variants (available are: sniffles and cutesv). Structural variant calling is only available if '--call_variants' is set and the protocol is set to `DNA`.", "fa_icon": "fas fa-bezier-curve" }, "split_mnps": { "type": "boolean", - "description": "Specifies if MNPs will be split into SNPs.", + "description": "Specifies if MNPs will be split into SNPs when using medaka.", "fa_icon": "fas fa-file-alt" }, "phase_vcf": { "type": "boolean", "fa_icon": "fas fa-exchange-alt", - "description": "Specifies if vcf will be phased." + "description": "Specifies if vcf will be phased when using medaka." }, "skip_vc": { "type": "boolean", From 82267507b189c3e0a7c83201c193ee8478dd8849 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Fri, 29 Apr 2022 14:13:08 +0200 Subject: [PATCH 145/169] Quick proof read errors --- README.md | 9 ++++----- docs/output.md | 2 +- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f621f09c..261669c1 100644 --- a/README.md +++ b/README.md @@ -32,13 +32,12 @@ On release, automated continuous integration tests run the pipeline on a [full-s 5. Alignment ([`GraphMap2`](https://github.com/lbcb-sci/graphmap2) or [`minimap2`](https://github.com/lh3/minimap2)) - Both aligners are capable of performing unspliced and spliced alignment. Sensible defaults will be applied automatically based on a combination of the input data and user-specified parameters - Each sample can be mapped to its own reference genome if multiplexed in this way - - Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`SAMtools`](http://www.htslib.org/doc/samtools.html)) + - Convert SAM to co-ordinate sorted BAM and obtain mapping metrics ([`samtools`](http://www.htslib.org/doc/samtools.html)) 6. Create bigWig ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedGraphToBigWig`](http://hgdownload.soe.ucsc.edu/admin/exe/)) and bigBed ([`BEDTools`](https://github.com/arq5x/bedtools2/), [`bedToBigBed`](http://hgdownload.soe.ucsc.edu/admin/exe/)) coverage tracks for visualisation -7. DNA-specific downstream analysis: - - Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka), [`deepvariant`](https://github.com/google/deepvariant), or [`pepper_deepvariant`](https://github.com/kishwarshafin/pepper)) +7. DNA specific downstream analysis: + - Short variant calling ([`medaka`](https://github.com/nanoporetech/medaka), [`deepvariant`](https://github.com/google/deepvariant), or [`pepper_margin_deepvariant`](https://github.com/kishwarshafin/pepper)) - Structural variant calling ([`sniffles`](https://github.com/fritzsedlazeck/Sniffles) or [`cutesv`](https://github.com/tjiangHIT/cuteSV)) - * DNA variant calling ([`medaka`](https://github.com/nanoporetech/medaka) and/or [`sniffles`](https://github.com/fritzsedlazeck/Sniffles)) -8. RNA-specific downstream analysis: +8. RNA specific downstream analysis: - Transcript reconstruction and quantification ([`bambu`](https://bioconductor.org/packages/release/bioc/html/bambu.html) or [`StringTie2`](https://ccb.jhu.edu/software/stringtie/)) - bambu performs both transcript reconstruction and quantification - When StringTie2 is chosen, each sample can be processed individually and combined. After which, [`featureCounts`](http://bioinf.wehi.edu.au/featureCounts/) will be used for both gene and transcript quantification. diff --git a/docs/output.md b/docs/output.md index 056820b9..9fe43e73 100644 --- a/docs/output.md +++ b/docs/output.md @@ -35,7 +35,7 @@ The directories listed below are created in the output directory after the pipel _Documentation_: -[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) +[Guppy](https://nanoporetech.com/nanopore-sequencing-data-analysis), [demux_fast5](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), [qcat](https://github.com/nanoporetech/qcat) _Description_: Nanoseq is designed to deal with various input data types. _Guppy_ can be used to basecall raw data which can then be demultiplexed using _demux_. Alternatively, _demux_ can be used to demultiplex FAST5 data that has already been basecalled. Various options are available to customising these steps, including running _Guppy_ on GPUs if they are available. If you already have a pre-basecalled FASTQ file then _qcat_ can used to perform demultiplexing. The `--skip_basecalling` and `--skip_demultiplexing` parameters can be used seperately or together to skip steps depending on your input data type. Please see [`usage.md`](usage.md#--input) for more details about the format of the input samplesheet. All potential outputs are shown here however some may not be produced depending on your inputs and the steps you have chosen to run. From 97ad3c11a933135182217cbbedb6c46e717fb140 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Fri, 29 Apr 2022 14:20:43 +0200 Subject: [PATCH 146/169] New subway map --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 133243 -> 146167 bytes docs/images/nanoseq_subwaymap_v3.0.svg | 790 ++++++++++++++----------- 2 files changed, 438 insertions(+), 352 deletions(-) diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png index 80f368e4e1cd0a2859d3252c57b97ee723fb3d17..39d86662ca53ee88069a6c1d0069364201e593f4 100644 GIT binary patch literal 146167 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

*Fa;0YwI_VXaB}>c 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 literal 133243 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 R^B)32N5fFPO4TmnzW~6QoMiw2 diff --git a/docs/images/nanoseq_subwaymap_v3.0.svg b/docs/images/nanoseq_subwaymap_v3.0.svg index d129ee82..db41c9fc 100644 --- a/docs/images/nanoseq_subwaymap_v3.0.svg +++ b/docs/images/nanoseq_subwaymap_v3.0.svg @@ -8,7 +8,7 @@ version="1.1" sodipodi:docname="nanoseq_subwaymap_v3.0.svg" inkscape:version="1.1.1 (c3084ef, 2021-09-22)" - inkscape:export-filename="/Users/chrishakkaart/workspace/nanoseq/docs/images/nanoseq_subwaymap_v3.0.png" + inkscape:export-filename="/Users/chrishakkaart/Desktop/nanoseq_subwaymap_v3.0.png" inkscape:export-xdpi="96" inkscape:export-ydpi="96" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" @@ -27,15 +27,16 @@ inkscape:pagecheckerboard="0" inkscape:document-units="mm" showgrid="false" - inkscape:zoom="0.44436162" - inkscape:cx="793.27283" - inkscape:cy="603.11239" + inkscape:zoom="0.51669611" + inkscape:cx="796.40623" + inkscape:cy="663.83314" inkscape:window-width="1440" - inkscape:window-height="900" + inkscape:window-height="784" inkscape:window-x="0" - inkscape:window-y="0" + inkscape:window-y="23" inkscape:window-maximized="0" - inkscape:current-layer="g859" />image/svg+xmlguppynanolyseONT fast5 apipycoqcnanoplotqcatfastqcnanoplot+nanopolishxporem6anetstringtie2snifflesmedakadirect RNA (align to transcriptome)direct RNA + cDNA (align to genome)DNAProtocolsbambuDESeq2samtoolsDEXSeqDEXSeqstringtie2bambumedakadeepvariantfastqfastqbamJAFFALminimap2graphmap2Nanopore basecalling, demultiplexing, QC, alignment, and downstream analysis.Nanopore basecalling, demultiplexing, QC, alignment, and downstream analysisfast5 + style="font-size:30.8948px;line-height:1.25;fill:#ffffff;fill-opacity:1">fast5cuteSVsniffles From 5158328c613ae2fd755c1e58b44b3a3a15d88802 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Fri, 29 Apr 2022 14:25:12 +0200 Subject: [PATCH 147/169] Delete nanoseq_subwaymap_v3.0.png Replace subway PNG --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 146167 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/nanoseq_subwaymap_v3.0.png diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png deleted file mode 100644 index 39d86662ca53ee88069a6c1d0069364201e593f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 146167 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

*Fa;0YwI_VXaB}>c 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 From 4a63781f49cd3469b8cd2048429062337c0f2409 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Fri, 29 Apr 2022 14:28:34 +0200 Subject: [PATCH 148/169] New subway png added --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 0 -> 146167 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/images/nanoseq_subwaymap_v3.0.png diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png new file mode 100644 index 0000000000000000000000000000000000000000..39d86662ca53ee88069a6c1d0069364201e593f4 GIT binary patch literal 146167 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

*Fa;0YwI_VXaB}>c z-b@UBeNnCDu)3D#(@~(q^5v$yt812vA}EzO0f*I80A#R1w3LxclKQzERXSAm<=L&= zM~e${%rYwPs;<70x z@swjOLHzHu{eV6G52&{b2UlJ4i6dZwhD9nT}xiOv-1x`ti$^-hZ>jnl7Vt!n4= z+@|05uL{`SiqxeX(6zqKBYMJ8$}Pt6Te(kr(%_-1V|AASi zrqG@6v77r|j()r@)jRS$BX`u_n(+4deo_bFf`)3^wEzRLHP=V;0wc@H z&87FA)3|Rr-PkBx*eX3R+#YFkASOPe@}Ls_nn}xD?9FZW=to4ys<2ok8G2COz0WcE zS#Qasi2tHSKaNh+zw(?I*U*FqOyI(_JpI-XZanP$4YHr0qs&-AhuGjV; zT{z$7XqLxUX?@I{b?^D$2<0c3QOzFny z{1yqR>r&H{ku<3!4$|EICv3d_C2yLQn_bL5(`QOre6{kZmE>h8=bd#!Z7xUSCqI;( zvZpR0T!>h%L+OzgSRL#r53kps__D}1$G$RtC!(~nipH}&dud(VD|PrCi@Ak;T_C+U zh8UaQkHN2QGHRza&TGvu!g(I&xNc##Q5_3Lt6NVIM z@;NspB|_i|N(HJIHMi4~z3~*FJz70D1evl~&}e#AvZb=B3}D0~wZ7wK_Bhn<8?7wB z#0RWoyyL)MmTW5&R5Z6tCb|u+mhGY+mGK$k>KHn?xmnL%KVPX8EwiQlQS_9_Y!o0E8)(Z_(%ycoj>}vKjr2uQx{uuTyuFq?g-nGDG+!~U7`u>kk zy>1_^o|DHhceLG&a?oyJi48fpzCmrV8e~<%^*nKjChNr5gw!rTNv&ntZcf|Xdk6FvXUa^0aB`5gNj&*`d`?<+fwwVg!b?RxgCxalFGm^ERc!viwyUAGV+5SIzICUYXU ztM5$ep02(#_#8Kr=Dm1UM3;FGHN`U;WcU8cz-QK!+yxXhKfyPuXhv~sOwFtf$Y*4r z8_Iwt+-V^#P-sZ>r^s|Dk&=yH((uxu_)SNfugj0POA6Q8O((P*ta99s;PUE zU-R%t9+Fc$yZxS>GSadKBnLozP9E3<_iTt?`dy8Xh`M}!A81tfY=m2Q0RRVRhC5K5 zAPj7@89_&abW{S+pZ38CgHo9C9$1(2hs`o6gDYvDV%IWJ!*V&Ago8VHc$J<0p84cJ!PCJq<+C-P41 za9>#3B!(`V8dmxx)T`C=tY)6@at~_du@v~)(Qhz2+_Y2nQIkv}atwy#cGjk|iBv&J zb#>#-W#JP+NK^^`ThfEkb)VMRIAbHzVb^}cR(L4@@Nadf;$=~fx_DSCvsWmLDz%;O z<>d*W=A5fsE->F)E1_`#9{Jfw1?I_@#N0Xe`)t3=?(`eaN2zdM;p7aVHGUC!=M}!T z$Q)2EH6yQ&x2@@TO)$x;flO|68WMlcDKNQel@`wTXh_edhj2qZyuJC-PITMh51Oz2 z*J*?wbFKQRIIMJMs!Z?Zt&P!Q^sQ93>>H?eb>iP| z4%N>!thyN}7Yx=Ko4l%hzZ3hVFsO95?or|qnnsn1!htwO($65?meK*+F7G+P#Ql+R zQi#@mSUKM=NZA!b9r^j7A6=QCVXOM8`GO3E!!Xgb;8W^}gU$=5qlj$TX0tPGr$(QS z%fTyf+Oqyu%T5iPwM72arpHVJnI75VFkHS!j^lG$xwlxIh6LH zliNKS*+32a*rM-SmX>WQ(1ZmfDk;Y(Ftpk)vJuD)hfU*d=;{PEH>z zZCYvC@#8L-JUCw9bKxa+B zUMdg!hIpw7PaT@ajm;k6@88=_)R?3kyX{HYe{?94x=jngF5a&9du{ht{;^H1H@8^T zY^m4q$L?sMCWHt)7=^tuE0;^5a7Bqk8-tyRqS0j1$L|Q3JxnzEcAy*9bL)rj&6~OC z*j^~qc!1sxf-b|u!waS3due=j*zdA5;}lA3=t2Q>+v%yPeu&B4#W{k**?jHM8bo0+ zAbJ-Kr1YL$&IpTNAfwZH_}Q9l8zFrvf&lPDMJ+@F$4}PWsVN5#P~s2a@eD9gl=F|< z7g(ei{Xq04GAiosg9o#9U758FhC|weWdLfBmsD_VC3gSveC*L<1$fx#1nyA}l$3jX ztjzXY*J<6_lV^#c#xb-Wm|yQ!uszKWSWW458X@dfP^&Gl7}tE#UnGe$LNr1aieZoU z#rhK)lDj-mh^>QT>lpJ^uKOh4z=i~sGEf8GIPg&8>J4Ett zzPM26cW;Pkoj|r^Maj$;5TX!>)Z886EUa$m&3$;2i;L4P9)x^AYy=90)PB9aS_rWy zcrl<(*Liayz|a4^)8&gWi`NRD8reDV>@ zHS@~~EZ*+{hVs0tU;20hmzV~Uk`0r*xw*N@X2R(J2I6fqwQ z09hJa7&sM%hdHghHt*~=Wj(7vx>OUqZm>rED#NwEy+Lw026k5^ z4-mex7(qK8Z)Zzq!rlrjxtpLZp{@6;SdcF%*~szA+R<871TjzbJK)jf11v=CnN(R_ zHc-AQf@|GarBixewZAUtGgp z3J3^%5VEBQVB*Nu2vX8TUhi){^jONxrW3YHbl(&O9A-m**l7FRr9VD1r`k~iVB@@q zVhr%0=bQ3KLw(vh#@3c}RSkX5>Q#8c{m+Ka2o39&Mq2Y?6aPWbgM!%5|8nmcLfMH< z%5To?R;|}|*!yfT*wySj0vcL_D`kSgB>zPC8cBqUTo!*5@nsUr7&*1EkD2F;&}W#p zJ{q!Q^>?M~OSzx$cF%BYYwLrEquDEt$tOTb4Wx_@EWBEy@%xVA39r%a-^yJjeF)qW zA2H>a`KB_(Pe@rvF$vN{k+0ogvtB!p06j96lLdw2gD&5>WUsYJc-->I4L&xhD=A%} z4Bh~~I)0ah`-i)$9U%XvM1Ic8Od*V3ds;M%kGl30kc}K{-}Ccv;`WK$?No+D1GNXG z022eer-wvmWwi)+0)Q<;9K#O}v%3Gz(4;i|Y}l;oWv%i(jKAcbopRt{I$8yOW8mq; zjnt*lJO366A4zml>Z_~&Ozs*kwQl_$d3Eo_Xod4UQE_JQ9MJY|0TrbqtczKwDc~xO zcM5&k#l^ieR$!OSJ7JsvUpimZNIE?g!h?Sqb|cW(deOBdJnBLPy!VzMcY1+I>{~;6 z1f}#d^8kvqk+Sw(1!m9JTR+7k&YrB-PJhb#EgkN=mJ#{u3i0M`J&c6rKD-hk-B(XO#5155Fy&AC5A}Wfo8C*bPJ!xc6Z+)BlzK$6Z^YtSi z9RzECRCZ)X7~HmLVa|R99j3^2lcx_BFGmO_*~!UCQL$*53KXgOKkF91q`z&2h#uKj zfksi0^St`{7I5aKATNYd*>PGP_TafMwzi?BYa2nzFli(AE4)(<7cOFj?*oFK^hicLSYp9`u(kMk0^qr@46Wj@s8`}>Q=B6upBSZ zWaIvKOoYPV1=;d!2TR_7m*(@_d`wA26&w=s38-p)Y=J+z6EsoQlC-^MzEjvwRRPgj zqRVfku`&?7li2=s@5Rw-`Izm&!9gg4a5y2=wR2(SFhCF>mXtWz?g0w7qg8>Hi#P93 z(gfVrl}()nI>7gHg6K+v=}~)b&XSMQ02}q3@F$=XcjE#s?hKH-0cw7S2@EzsNg%rv za%?$G8~dxc+kYm(D+~A9(@%;ep~U8{o5Pl!LR{7<{#?Y%m*Z<>K3YUts*Zhhl`c1G zL_1~{W+L68aA^kL5C!<@s@BByagzB&XHp(-4|(S@+~=a|T?vboXd?6^MTkF&+yDc&q=mFpLR-z|~*QSDG*TFobDBG=&6y zzSw-GOY6=PRwl+uB>7hbzSLiusj4MTTjaNPnR`Y-rYM_%^DRMO6DQ8%2TyTY^Gnw_ zHEH2Z3Z-uX4;hjJiha(fEo%H(=(IzARW^gDTh)fbapWZ)v9e7x1ii40Q97l-Vp_~~ zet_6OV8$H5>mMI9pM9wW-e!0%MC)v6Q4V*$&%Z13#NQ|JAkHzkJ3K{ag0n&Xjy3>| zbh^UD*2yv3t_@R)c_QOAar1Kag;rm(MBI@GN+|gKyB??@HH6$wet&6PL%-|(G3?*Q z@v4bX7ZS0#-ad8t?{8_^aa@OWQ3pArznu4?5)zh81p6L|Z3F=JWuu<7|h=6^jK#tEv?842WwiBc|I9DV#CZbr`==@;(EoyR5rd5nV zy6d#QmGp8Kv~T+$E>{b$1??xGV)Nv|)y;b3-?#GM@JYSuK9SmUM>f(pkrZimMlQCG z2uzv!7K6vw;^p+F2PQ9j?jWClT(Sai4^4y-*oERuuNz5m8j*Sa&lPEwd#x-;BQ0ODzUxsVy;#idp#}_xO;mH{-QDgRF1*_`RE|6 zYe<1RI<}GpO9>r4P+VMG0S>cAG+d7Qn)l(h9>437R#(rspR_n#_`9-w8#2 zP?r7|vH$OmB6I%RIQE}kmc4~c-~TQ)tAAMR|GoJ?i}v4!_=%(`K9hx8a*2cLmudpE}YFU<+ao zK#z&!lSaZS5_Lcz{^!!Xl$!{P65XawKz>COb0PcH|GhO-kjg+dz0Kn?F`7ovO(fQV z7o)$@kC1NvZzLS-h|l{tgG)6^_P>!+#8Ca;UnwFN{=Yqe{~ome-R}QCYo;kNZN;c5 z9uhzi{@+Q+yYkN{GT46HwX*muPZ54kHlsl|_8GIj%BLR`N(nN!u=3Oq|86lHc zb|I(uMY12dppxowOejKo{+WEDtn3%^VWyy`7g@Etr2PmINm+vqF)k*;8^w*qB8^Uc z^{?Nz{CSds4E^;#vkN)IsHO}1lWf?Vgk{JtyeT-dRx3Fh4}dXZa_~-xEOpc0U7i0C*bLCJ+e_gCw1=UIUo0H9D#KD zuQiq1kVG8#4@YF8zU53G%t7F0B<#64ldO(EUF`99>P-#cJEymf@t9U@z)02s9#Y7+`m~F0~KQ)>%|sxadNE5 zzKw_=`=)40w1MY9vrA9W_i{GK;T7J91@8I>+LDB*brJtp0&p)G}Q49~_`{&L=Q`;tCj}f^D6{v zVR$s%bKW*_o=WG5cLwx)E9|sz=WEZN1w1_)banL;O8XY(ILrB;88Fp8^_7v6Wz8Yb zclbr*H#e^{bjFhId0_9r)be-vtE>;^L?@i!?HA1{ ze&b0Hd+#Flq;(E?z#68XO^9W`$_c2%vi}st9U0kL`r1vrrrzRKsEY_Ir8Wwafcc4MpH?QYz!H!h!s#W(`*nq)WWpgqs5I*B28E3pF1QsIDI@?DR4Et zINE3)?|)c;AVoptb8|RMiKJ|ap&^r3ge3K^@*PzL;a^2&!4KIcCNGjz6SyEV_>^s< zsOOFryQR~oQxjLh;sXN;5_#ElJ$_!Yr!y{>P5-X_qPtuDwf&_W=iv{Di<3c!G5lvl zU$EVh<}SiC1hn9${bY=d(w*bEQr6iTbEYn9P7(RkopFQk9el=Y-<5(j-c;8cwqX`7 z*c!-?Uj7@BkFCFk|3_GZAG#QqRKz6Q;5MXWQpgjs^~=`=>DxSHGc-k*Ji?Su_udqH z@HS-)RvdV;$O_US?)7h8?^*OsR?6l|-1SsE0#1EKUIvlDMHvpxEp9$tOSA6;y4Cdc z4zd|emxv^0UC1r^eAaHoVH@7FIc;m{Fz$H!_@7y5B1iGa@0ZS3FCc5nv=YUAD~U8i zb7*)&Xrh{YBu7})_8JKe>E;%&P$8-s}p0AwJ>d=Q2D%kE7d3{@Ua8$0|5%Tym+|K z4lcMO7o$le-R0`6!}1?PygzLQM8|(=|c8UP)LYM zfkF9N8m~*=l?&clWNP#$ObgUbULA+ou0TH(NvtTFNY218yaE}_11Y!)6Ajs4v!|Z7 zj(%<)CNce-L6K+?D}?07a;XPT$pgf~6;1UWRAn>hKtpr+Z!@hi*Xi!Cy-HFih^Vy~ek{*t}KXD*3~vrj?K+nS~HhvkMWv-ec&I^8pBx z3@bKbR+JqnMC6_0p+OAS)#yrkq zO9`C3t?Zn}K3>^D9~dRVs+sG$?=bTe*Ie20`_xXHTFRwjKg8_WZv40aoJYA?o$muA z{mE|russV9{xZy87p|oWMv!)*P)^FP%kzHfokWMOujZ|PA?TBTK3tRJLoUhD%N^-d z^_!%_Z>fDXGR!C`a?h{Mg;rykkEIE^XVNdvZg*s#FjnLs-<2WqFV@o%u(bNb!1w2g z%&I11Y)D7tANm?e0Zj-_WrrMD#-3Mnlt^JKfBn-eMoB8om>d7^t&foqnpIORUT3&> zV!=O~cdp0F{9OnOHA=myEK ztO$g8ksJzO!tkS0^;zsW1s0rB)n_yg+eQ2SP4W3(9A^S0MIx87B^{*hv!wV&fTVN? z$a{9th|p-qXJloy97wF53&q>?3&YG~>feShqD9MHx&*56T(}x1?F$$rRx=%1*|g(} zDeu|neRL9n8@?M92fbmeskjbgzo>&+PhZtC$$Zf--7SU9JLFaIn`RIL|F||@SC@9Q zXlX+0aABW1e&JNVTOXQ$xX)Rco-yalk3I3@A}}K=_ejk;Ix@e=rY3~_wP^eZMKG0j zf6j2K%}S8b{FGFX$6VN2B(|sHu*ZLNGE^;t-U<7RU_@@mF!~y<*R}09YR3{GXS>g| z=FL)e^-MCVi(W;V!G(^0E3u=U8kiHc^emMd8GyL#b(X^C?hi_l;R>+O97v)(@fYp> zyO*-&uJ3VC#4qmq&r2}to@djU5dGBMikThwikr{4W%fzGiI38JjX*#4Q@&c$OtSfC zROwAraj=$o1lDvCDJu~pjym2SxutWqn)aV5s(98cc_XmHItG4h(s7iZWTD$e9Uh_3Z*2xFkNeoknhJhBe|1@6k{RA+U0LK{C7e+K_cq^%S}bB1OE!wags zS23tpX>Oub$6+JKr+*ecEBh+ER=lW)#q1&$bmIXPnhY&D!c^|%u4SlGeW_8(nJoUA z#cC^N=tYSC@_P)z@Dt2|L@{zzbg-|GKS&pHz}s-bOXS2`FvOnE_WmQ| zPjTjuF^uO*CRu#t5`dbdQ6so=!tOS!!{ z4_;Yx#Qp^>BrOx&@Mi{h=ASA1QEJ9obi;`Tw6xVgWN;Ar_<3ryZv81D(!V;Ss>B>- zq21fntfPj*?j9OkPaYwM6Yzp-$$_mtbGrEy%|#%oxOOt zw@!wEV9#Un4J`-P4T3k78-^4~Qk4~M$+KeJ?E>DRACBaTY@g92Sm6jd`__@^8oxCU;bNl!CDG0g0*E+G^)M-un3iGGKy#*F zVKY$A(usxk+3%qPO0rGHfayBuuRFz)k(ZZuRWdtTlz5_=fLb1i zZx{|s3$W0;U7tss73r_;8IVQC8*9NM$0%f}Kgz`C&c!0Rr7PkUV|63&)s@pXhMWzN zFb*wI#J5eKLSprhy@+!Nit81-L)JB2pq^t%$}FLqF^cH1@jq59_HJ%&j!Z~k*rgkl z$Bw9~JLCCPCy_+LA~nL}Z`h4s&XDHU^({n_2kIRI#U6RZrF8w;e-@JZrv4C61am8> z`4Gohgx#th-8B04^=ltRWq>YnCmuN%{ZqT<8iWx7`udXqJb5G85G zAgA!~w~!tJ(VlIoGsv4FDR4OHqYi%kOcDo$$@}YDeCBUe&*M&@r^EAe-f=WR=6?0$ z6iI``8rY@T4!_M$k9_wI(NC}LvhMqxkwN5k@$(ZU7fDmYl(gY_xr|D^HyxE$qp8pG z6G>(B-cei%{O~bRrOo%rb>0e7fq|MYtl)4da*2@afdWVtfqI&iM~d{{CMu{rG}Q;a z+)_h7!hq-Qc+}LV&_fG6!*lLc$I|(Kdm<$(1jbE#Af@;;vS|Z)#ONeEcp*K`2?9(wm-+Z2 z>t7K#x3S0l%6)i!slQO;Ke9Stx`6;bh>X+O{__J_3Mfm1ET}4IH9@8isfPhTMVe96 z={1yem_Zu{YVH^6rcZav>mrkqenhdW>~A!ZVJj*rrMcO9t>ysR$$Q;LY#&Df-+>GV zbep`&NtndmLy+(;I=T^5=df}NtAwC3!VVr``u#)oG^OZkST>N8h3=&&-;-ryNLf-Z zo@GRM~X{NK!hN zp0!-|eUPGwFZL-mq|$$;60;w2uk1sECFE)`sZ2f~Cx~+CmheS~E8W_(b+bfQRZ2t8oL}1ol`*x06^lQ_XVrTH(3P5I1R%TJT=ed8!jCBS~5H!()Zpx;>}Z!t!BfSk7S@Z*r&%ljtbE0w-yKI<%hnIRYd zcxB+_?KBW>>)g=_{U+`SIre+P?9UyZ9uM}Uf_&&iIC&*{OFI%2&4 z>dG8dgMC%+Plb%7^h2>aUho+uR6)%lv%X90e5Q)j1mNj8`S}$}Ebx&Sph~J9M#^_} z=iH2pm|?a|A?fbZdJ1K!TZ2MIHZHJT$`t0=RggeIwOij>sNN}RU=V(Z@nYaDsX7$!jbC3+{Ei`8F zBj!f?1+w_i6`eWkv8ilrZZ7=JB!=|PIU?myEU>*~C`ULzC3~a1?&OD8?R2Sw4o3^i7 z6|(;j0q!0UJ@w#$utfGooJDtfA09v+zj_t19z^Z4j&7}{+=R6Usi*fBvM>nQU`?b2 zGEe1ZC*vSKj*Xq&5sG9}M$cV~m>YG_omIWVNmeApBJ#3qM6laLKtuA+qZf#zb9Q!5 zwWl){{slS==tp5Al0mk^WjjZmP;Fyg?l0Vnt;c!VosQ=VJ6NRiE&Xrbhx?%g`srA; zDB^mtK79BvR^=cCwKb3+MT0&U*2`v@{(7QcQ=PL~bmz`m^j$7p>p=qEl_sxDhS^9MU6@Ukj zK_hT#EPH;Mjr<5EDyl~Bz0p<`o*G$8%WGi4lK^KrcUf9G1r~tj!(dWOj5b>U;>|b< z&@bV@3x!v3-!Lx+?6%QSQOGj_d+UwXDoRNNf1s**Av^gw2XvJo+XIxVjC>9(>IOYv zcV`n2=Q8RpI<(earWFnq};q(EZ00?J}9> zd1%$5-}Rpx;^k&OXf20J8YoMt%5uDdD(40`GsopGk3OBQwQ21)t}&&v+*#pJ23mch2W*r} zmZzO#Gc__Nl*5(bh8L5aFJY1CEnrF=k007aMB;GH6wHnq( z5awF3BBcE(h*yIE*bn`?QBIbP4LRs&RV}24c&wK8zwIoMT>aK_oP2Z|Sz}U< zlk7QnX{`<%xg&R6h`>*gSI7%!yO8};^UO5)!-qCt5IZjO24IknKtp}4cU7X&%H%n2 zLZ|Bv5l2UFFlyLCuPt`d+|epHfFQb!EwWf1y@-fk7yAZ`^mB z2RkV~{=2r0A%e@i3r<2wLxb#Q0ECkJk~|XD(wcA*Z7z(x#;SSe#XA4ydsi_~NIsz) z0Nkb|uxecs7LEh(0KZw&`Sscxsxq{b{09v6ht89$0ml-dr7Ur!<1wxE)w=wfTj81Z z)yJh=1PvE&vU5_ao>#J2=GxM9y1u;I`D^JZ6t1+)|4j@)C0`3u)R?!DBFr9$;2&tX zUlO)s1S=xgFnCWi0ngZDaH=TJ*%&020IWxI)jFiUv%oO849d7>MD$CoW(^aIiqL40 zx_Q%_4n`aK5B6cvS1|#XSKGh9?lE@G4KM@{_nMy`A7G)}1}%JU>kxOnT!%;i*bye6 zQaJ-qv{b<2`5C&+94;5m1FVJQW`LyE@pXFlrQTq`55+CJLZT(VAydrE-24)+iQk?l zfPS%BS$wOFt3by%I>ut&H3H%o<+vsz_vY;{n1|}ES12C^caZS zC;oCjIVk8J_~Dvy9*Dlc)$j`l07z02umx4_DeEjtFbSWafRBKRkXW0=e825&m%71z=+()D z4SsCCuLvIw%Y3yduOL#I0VK;D&~~T$o}Iqfp9}frSd=t84;deOpc)%&#UO0A?K56zENxf0cn#D~Rh^tl zjP*hQ81cNWZu_^&CCTT4J=q#hfS_+>q#~M1U8KHn9E$v2b>k(?zPG9oY!cilasr{! zkeD2mdiv`!B1Z_@7s9u9^X5$-B|SgT-g5?+wo}dA(;~|s^y_($e%+3=xb<`CPy9J|BDN{xw;rZP{WxZ5Fyo?6Gk@x=l&f$Qoi4qewL5Fl^q zC%m3$@?y_@b*PU~@_Fz3#|^Iu$IO|%R*KDre(;ZFshXpNF2|I(P4D$b`yJJ`+hmX`;HL_O4Lu-H|l2vncCpEt76C8Di zW@cycPHc`Kc)&Q zz-KX5gO{0192dV2kqQ83u{0!iF2b|J>2wV7nFk<#ka?&XrU7UlOhpF(;TCnArhpd? zX<>lyY@jd##+`&5hyWcoW`E`0xY#g&+t`GJVi6&1IL~^PGngxCXv}{pA2WklUxDP| zh4q&LNHlCu7y+D5b>3hNpbQ#;paqegAL8DlRX7ST0W0BTZZ=VSd{%b$7NiXXfH9=b zV4~c1xCH^Uf#E)Q9D9i1i4iAn*>@Bk2+_O)M40?wZXmTj_oXlikRh-^qc<9e8#mO0 zf<)$#nCoCZWgeoak70 z+apTv!1h&Ru|_9QpNe*Jn6Xp{q1YXDXc z5K9)GqRd@5dw~OG0u#9*CAj-#7v~r8xp?Hfq~QPpz$1v@e*l*LxV`+GCWz|N3)y^! zi0iKMim=VVJ6Hi{KtcT}Ff@3arj8ZYAqUQ`h${qE3t@5r_RTZTy?#*J70g8W;HqCJ zEe86wZLC59Zo_F&G#swkOk7m_QW8!Sk;I4}X(o#Z=nvk{UG`S%q?Ii0y2GxGWi|rj%3A+7nWWKx`GWc^rpyE!zZOg7RWjlCg zG$o$`@VlZyh9sW;<#kWJ2!Hd}^;@0bojd>7hOK`&Ab#R_Y&>=3O+Q zp6M3@o6IZ5gdav#$#MO=d3gaCWV(eYlg#_Uhj-=&_3l8vmLCBSmO`w5yb7q#VLsWdu?VNv9|4Vj<440jZJ zcf(Pv=-bPmr56_-nB^}`a+^c}3`nu`FWCf-IspZqliwPKBO8~(@ug?QsS?_(mLN*m zap2DPx(521`4Fga7?t{Y`A^EUk`HBLfAu58)Squ*k9laj^4EnaEiAiqV0uwhFgfFx z9^2gCRHlP`=iF2 z+l2GbKOvE{>CO@K*+f8EuSv<$YV!+SR_taGBiFKzwhUrWld z*sfi(gvKFsz}G7=;}E;V!Dc_WRqIO>it(u<6Qzv_QlxNoxGn}qK*(IXvMWP>(%zF2_Vr^fPsq?6anasdxxuR5-kh9^ zx64Y41xJ19DiGHF!4!NW6f$-~`x2uUxZF8nFYn^CzDQ=s#v#mx;;ckUwnDLSHf-sN zT19IEuD?{D31NkEHyFtj35uD2z=L`ALZjTF&fRO)XAvFb9jJ&o=VoKWh2S7T9y}We z!QiWqb7sl2o@-KP$IigxC1YoYVc^hk+8ZVqJ4LZKJ|h(;)q4CG<04R6*T zNVWYB3qbrTESnp{IDryOW<$$kuAfsfxqj^$61E{u5u#{0DB2E|TGJvBS0smoxR`?j zY|j3~5X0;fC#@lQ*`_Y)0VOQ~tKJ;;EFup`;?X`gqT+4ob{9tLqs>)SRV7xoy=X`m z7Z=ALY}EQrEL3r_QlgkfQnXpyUo6q{o~V zT!RJ1u3Q>ekc#CzrDB-qsOT!ytB+ zsyoF@E^8wo=sdRp1@fr)c)Fan6#s{fl(wS(hYp;=vhGd(f4F-Kuc*GTZJ41IkWxB_ z6zP@}9g#*#9WJaXB6{V5xno&nWN&#WWK~lPN7Z&2ysx{D(4K`K7I+~Vt1=1&_=_!*_Z-%fqP$Ri`srdEl z2%y{mGUZ1l{Qxf638V~n`!YbOGDmVkzf6CAwW9mw|Asj5 zl`6OHapLW^$|G*dsceEp%^ef~#aF3L@tjyJbjVtjM;OUiGM-zUQ*8(CiHeC<{$ffN=<5TO>Wm*P#9@{EL2n)R{Wi3$$M`0yUp!lNg)+n`bS^gJ=1Rl*#YW02rBRQ< z1(Qq5n_pi*^MKAAxt^NCcK&Traph`y@eRW-Zy65@gIYg_DrEzF6i|Sdnd2>iE*n6I z6%J4ZgYG!HLNxN^*SdF(kkQfuyXV2+(&GWMQ%2%8z&qYtEvxzVbCZZ#2?f-Bp8$#v zUyt<>+A)f^3aO{~SV~~DRvTXT`Pmf&$IYf! z6+^FM3W35_Nf@sR^abBdz!W>j{`}T0QzxBc8~9iS>9VhHWtQ@lC-!Qw=!2(#3ie`i z%8LTk9T#fE{*kdBs+}?rs;zb*6Z>=Jy_B&(WKBCA3d_xk$rn0y(iX+l;04ZP+$Pfi zvM4hD+_Ej;#|H#98_(7yd)jzYOc<~I{MgfrgN*P^A+T+rqA>n&c_!g8HAr`x_LK~} zwD)U*p+7vo15KTk`%nOEy*SX_7FXYP!CwBosGZr4N7AO;<9akv!nejspOGi+IZe0v z8xH`GXH?#j;b4{4pdXz82@BaZ$uq(?xYvJ9th@Nn8cEd~n7S`4**6Kz*~5x&xoLK4 z7(~W0SlkhokdP=_($LZps$RdZXROa{FuV05Z$ijciG->10bc&le{t>TKlvww_nXOk z-|_}^hZs^Lhc(-SkV2ahos8k@8E0KxUF54b0j9{()@-QR^ks$6GdHE{(E>kxPo4Ju zS@4K%+SVuN+2DhyB% zj{=&iS1s&Zk@)FlHy{z_dXQ}lkmjV*MAK43EQMA(IP2bHt8B7b zZ~4}up(ahr6q1f5wl!RUA;RvQn ztN~e)K!e-Vc(*Z_+qCo-``7YProc5!RU?2e8=>x=$u(`n#6J(Exk5;c=BP_R;+Z zlT2TLc;UBJ)%k7e9Oz-|9yo;Vtqn6&)s|JH*BBb~oQO8pzgZ|0A(^`l;LL!l0h+U8 zQ(De}3IF6xDE^n*M{B2zEgfUT6^Ht$_Xe(vEmy7vEwagbzyLxq@?vxLNxXixLS0vV zhyXgCX4S=?_nHG;yyFkLBle=#sVP(*mn#RCZ@oAom7iGV0^3Ua^l1QcJ?Sfgp^LmH zwnS55SRiqQ5K7UnHh@*i`8o_8tuwnpJ_>Y?NE~;&HdI~569X$Y>w)|%F(pME=u7-I z=?>7DKtcw9wL~EkW-{>X#%08-fz&1&#M6(QW5J_~%1ypFx6+4&R{$CgDCLrxu)rq( z_EjeX`2OFa?W9%ovMN8eA|!o<4YhXeDCUj_e>Y!l`3QXQGRwAR^C+cqppOUOF5**D zmm2U%0Lp)Q>Va=!i@E{rFW`@qPkU5=mAZfzrTv+h^nc=90vH;x%UrKL>9&{;B3_ov z6In6E89lf|OB>k;Q-nFgs?Y0Km3Lr2fzw`MuK;J)(P?ONQ5F4asRDxd1@#1U$D}rY z0kTy9fl~!oG>Xk{qza(S9;Q+V@-fQva&#f!#DE}hs_~{U29+Y&A!InPjH0`|pnt(o z0f2ddj0Sx-Cgj5<9*_OvK0k(4JI~X22k?5 z{^ufZ_S-NWp_4N7p4m2nF7GalY3}b0f&!VBsu`keSWDH zhYjoJG3-Z%kzICgJy|LBzn~11bKDw#kxm2L#jTcH!ZY(l!Tgc{MkZ6gi%ofYfR@Mb zo@)We=|FOMv88D{fQ{X1aVN7Bb&mTN!od#|_F?Q8zVlO#!fc-mlcs0+m%e^WzR?Gu zE|wpt4{gW{-9HjtDpNTS{t2FY3jkJ&fNFrsN$I0;)#ogqai>omL!6ko#~&&WP~1Qk z26XLUfSz%Q58Dj@<~9VB@m6!2MqK^zMnJ#GpX)(%c7#RFJB`o${QMn2_v>eX85*#4 zaKP~eRM*t>0V}u{;NpRFQ>XIffWg}mkrdIdH++;VfF`d+pp{DwKoCHkLjVvS-LoL% zrnK)lZ>VV}LEI&PIszKD#DSjJNRvvduSxNSL1|9XU z>57)NF`f&-8ANxnf3yUUHp*T61YnJ?e1UITkeNa!5gLyg)4SdjvI?ChYuHK0%yuRK z%#Jibc*$Md4v<&kKqnJlH1a(v;u`+;-*^atps~rsP1lf=u{$KG>VSm_+EcCXy3jH-R9Q5mhe(Jrdn|7XyT=^ zo5eNG>VE+Y{!)mRiC9PA$fd&-Md{lDarm611*UDJ3~VK4)i?X$m(W#2VNTT=9US&y z3)4d;OOOa_$1pL;NN8+2y(nEP3&VcP}b)u4KD7L&OvJ;Zh5WE`@F(=_Wt;z z8UAk&{`V*E=l|_O0FLW(jJ9wCM|MrE<9W}|GNyoUs=05O3E-E!XiF` z7u+OtQ5H0w)ct=v%=S|P=I}wBpPtatO(0UmYYF`6WBGf>2V-W`v%|wR!)vop#WTPx))J`b=sp*#qehk9mp`C#BiTEK=)KVd@H6v`K+ zW2Fx}5S?K-Jgk{ox0&i}05+n45<~{a6feXespDp+4=J`tE8nGIc$@hM7_H9NGM}7h zH2|l!_g(4uqpZBJ<)=nvI_B4-DFW7)5yPacoPU)*9qpr_{zeC(+PUaN6xy zowsIjA!5%r#e&{^($j;o&7{fa$`%sHJrNKMj$Qvf)GkIcSF|-J=n)u);SKm|bw2qb zI=j6;fjlI?MJl4IMcV&QAt z5^A{PBJeD}Fa2D=9tAkeI%d=914GL5@kC6;zO@y@0n^zRhjXSGp|!hWVq{lHf6vh! zj&j1NVc8hO{6rP@%NS;E9X=poQI&|jgpn!~AT)z5qAWK2R0#V?Q%DiPEIz?|N>(BV z$jn6*+yJr4R}PBANzby*oVq|}AKiUM038a6^U`>Z_{33|qe#^Lh2x%CmBYU8*PLkR znD=MB4)+VG%-^ecaqJ}W4MA$jmCs4tn5*90@9O=e#T~nbU%fXjfwqO%EhSG+(F%sv_X8(#8m7W0-)F5EB;$wV(mdtAJJp0QP6?z zh$ZU`hU~hA@i{@Sr|M%I+aZaM~J<;Hj+*Jb(M+WL`*89*L3@aEb^hW=Ejd# zFFcul=fx*MUDv85!ox&C2WGc?*K+Mb*A%s0+zfj$P*KfanKyXq-h=alr;AGaOc=nUjNIZC$2Bs?&o~cTRTa4R41tMXvs?K`%+KMKqGXN zIU=Slb_Ve^GI(~~z!55Cl^l4EyJ|Sjd$6#vZgMM<0G|yyO`XwPYr|*;VLuEnU*+}P zr26h)D4FqsLNX_Pu;zNelg~Ur^ZuQy=0#hLh!=+~@}Z3r(c5E>8~J_2=cZiS(R#+D z0p^fT$T~efG?-5@{za~?AcLI8ijB9a(E@>M9q3HIP1~t z(TfhGi|Z#a5rTc=@L#T{EifB>YgfL6{;c^>pAIMZ$$=!$UKwfWh=Wc}3`HRXeoon& zzFW`XJ!l}-cMRxPoNzEx@(H#jnq-)7%(-e#DVXIa>Pm<6yi8~JZb#ReEQ9KbkA+>h za$svoVEBu}Iit1oTHqL7^uej(macK2s7sk3cM9j^dI!#hLI#0n`6@t2q1v2E6P45} zhgd%jngsC6a|?b7L1STQ>cFgEZ8hfHptbb=2!9prSB&Ev-&i8=Om*7ZjGmv9w}jyI zRXjhw{T*=^%X?sYnQk3x6PmJk;^NFW)4E>i+{U`5s95j>ySznu5TQH}(eLMrYu@n5 zd8UDz8VKfOzZ3l9?|6X09E#yC(B(6hsO&WIde{@?8Nao$fauD^p&aJ0PfvB07>BT0 zYi1)9*piTV-0D4I=!Y$fwTvv zg`nglG|+0G)%^aqxhR~;mA6L|=cTVJ!e}=(4`+}}HYR=@QJZ=1a-sys_}Er&`Z|db zs(o@fsR(Ph-+=hY+xxI+aEW+aj{d+{3bKIS}W0ExMJA4a)3H5z0eBoIcmHH8H*sy&dgd@5uj$ z+~8$9I1b``=$K1lPBn?Jm<40j7I(55wr(mf(8)4*t!-{ph*UAEDw)6D4M>3XRXWow z&E-hIv$rm#JU`58komOA6S-mmES#5vqZp|hjMidTj@a$=AjgS-$Pb62DVKZKc0VJp7m zbT^O&#-pb&6wBG{i@O2eZrc)%QJ*0?0MRL8{W{~X&+UBY8t|pPDQMx~gQN77u%&567HK+aaYC8kSm> zIB;{rb*hSfZm9)%c5AEpwoH}7{RWTD!L%0?Zea}Qee#2wi%qKqTiGnBCur8S7}5a; z1J8UHPQ-%l($&le1I!`DgnG_a-rfLsh-YWjfhN!aY{F zK*3;+R2;Nwb=e0c8vRV+fbtuCCA~#4hT=V*WBzERE26D($`iA|kn>qjUXO5t(DG{t zbVzG#)9EVj&h*w;J256k+4)>=ri!3*`jv&ctw31Mouql2we8fkjq~$~mQ8W(lBZAR z-1V*LJei*LYpCC97eEDx`YwL)@%k|Ec`1Yc}2Ry8>Z3I-01W&^4hiqf2V+0A#7SNU3)V zO{F8nL~x^8rjN1)W!{04HLA&%4%n0?46oRj?f;1uLa@c0$KmrBd2&Cmf9p2Hb=p&= z$DJeyA$Tkv)A(-NX@(B`WY0WcL?Bm<(k;~$$F=izK?4j6);Ym3?YK<%wBE;bj3UA~ zMn!s|X+`lt5*})tBNgpV2amq2Wh_4&3S`{Z>~g2$i{Ns5do?(`QLRRK8{IvIKK3M# zxbFhZm4=;cCfUWR>YG!PT2j-3j?5fu%97GC7Y6b=aoNRY>AQZn=bEKAqGRsn1b@5x zh{V!Id()`4X(JxhzPuX|u`EZ6_2Rbjof*B><95rI;Lxtc&Za2Twb-N+VpTj?>k07)(9P>#7o*sn=H+~}*)s3#AQeUPNe51Fz%CLLs~#gj z`rNGAdKx@GmcH<5Y|+RDt}}ci><;|F4LfSOr4B3tZ)#YISDKM>I_`#`wxJOGwrg=k zXb{cTuUg;?3QQw`gy0ef+RAT1;9B!T=$W2nK%So5mMTge?e7JNCVGVcWDX<-jlq$mC;A!l*|DNOM~yKDtZO4rkp;g3H6E z!*heBJ_ZtjS%E`E#G9|iFSJ~ZH$2ATPeW)tvn%NKJu0{*;ZOm|3ROyB?IgvUbwm>x zjIEb~Y9o9?wJH>b;JYjHq^>JjnU*xnxagewFnMT$`(VME54fwmX>=9x_&gA%PnWM& za(XX7Y{X!oy1MWIwERP&Otn-hK_I>UyE0%K*thHC0i>ffI=eeo@qgx_rmH`!Yh|+3 z{%pr7M6OLLT#k>BWh#G^9pZ6ZvAp?SyT>)Y0QvJR^j?814O`nPcl7h zDdS2y#F0Hc)7rL^BPLgmh-hyKiQ%ZNX*z@k3S<|0_o(xi^^*(SwQWcHOECSEGn4_; zl1-ZLbhGaaot~vArjMS+VZ=h2)?yqrj3ZAQqzelAzRol67}o3WLQB#b9zMa7{lGaT z5Dm4aqjhU~-6EFFl2e%VvpS_7WMWem#f&ia$Jdj3&z#Pt@|WMkGe)P-eKjR-&VQh( zT9L^Go2e;**?zYR8KtWJxRnPtWcj`&=#{3QU-f60D$Vzoqg{~m;Ubj@y40B1)l1qK zRwQL{tAm+^d>Np5U&T#K5e_kyVZpO}~c-yKcm*r7E0NFr_}nwbcVr zpM3(Mak>O{454o$QoZX;hig>on*WLp5p*!LOtz#)+&fC;Z^ueGnHhRNch5goQH~c3 zlq~#4qp`9M&NKh91W&lf$z5*71M^KJD?+LdB&adc$+3@eX)T#wQc@$%Z{S{ekJMVq z4N2Ea`r7n@d<&ahA1vo-VHVN2Et?~VeE9sjr!vPq^Y`U^XUdqgM$Z7ozh8ERy9a%S zv+{-9d7X|CV)?D(0-xFZ1ySDH8DdC8gqf9=sZR4&1gm4U_B>6x&B1PEn92A zUIAHk8Z}2a-TfM&5yc$8W?Kab`&;i--1U-DS@e>$nkL~RbUwJ{TXOftkQDhj<<=tCzTMk0vPpvsS&lSW^5FQt1MorZ z$5h8EXr?WEsL#@}&;k2O3#s6w9Kadw89vVQ@2MH#ujvH$`ba z6du&#EXFK;0^$X=y_zU3R2gU^_um~(Dvz(B+X>{Gw+Ma%3rD zy`eOXBEgnan5$`^)8g8XqE==zcu30OZImg=0bVeBxOZsd|paW3P~x#`?$ z!F~mWaN5YBr01R4%QNL6<sW9uz zL^){peAFWDX5HUEdk`x1aTslxBe*^25^8R=+xFkkXgKr1+Z^t;oD21ekpcRYLsZmP zt^*cG%JUnaemg-l6LnhD*2-U>$pqlbW^ok|Tiu50)9r|b$Nbf`W+ofD;P-7sCNzPX zGu;fM=N?}V|Jn3``(sI#Ml!Xbj`O1&>o5GPIQB}%Uz@36U&0g-)!=(XHwyf1!iEr% z%r)?8&O;Csq|Pwn$)HTMF!159ZJF7F>?k-On)rb1K&Tf-2%J`7a?*06&Z6pj0qc>J zhm3e~mjX6c(CERQnbr1ZYz5uebOSB(IF|Ua=B_%C1A#MbzLBY?u~TL&VI&RCQ{Ld4 z-92kgjlVB9XkMIEg`)>oHcM2}dpx_Fskm(7^FC`?iM^5Z==zo`Sn(J=d@yxwb)s&# zu^6M--D7ZVf|=r!P@W&(=K1v*=XH@9 zgS(l^6uX&r*3gF;z6w7V?lXW?9!gmJ8< z=Yj@w3-oBKtdI5++W)MJdwA`U>%0v3;nC|57q5sxY%Kk!(dtgE(2C(mR}uY90)Ky) zCLHDdgUJe!u|7@O`tx&r4|eww_^suE@$%-*0n5!&>v1iJW)hS>IQX(WgYnzweXai< z{{1NpP9l%3%M^`zjW_7G4*6JM;eV2*;!^rFy;#Jhv~lfda4*$t@*wLdClu6vXI~fA zONWw!?H2d@rT$y$+@(VBV6epRnG%TXw!D?yjMdEY6_?$wgIMj++8g?z?cD*TgtcO| zm6k9&7GbmLjn@mWWJp&6Q`j{r1N@Z?CIW%ndmV8y{clXAM~g07BPo>z_ z_p0zF^9ypX@)x3Zu?4;aN6QZ~rMhdX1QN*V&MSsDNCHS>WM@_)50QB z;axe?HTHp}KX6BHuJ>ZIx~AJ>bH-+-Aj)fjFn17rMv&M)D_9bmGvv~F)ak?dVgy$7 z_4PK_%WeFkdPMFG_vPr?URNDjtmisuCa$7}@^X?_n{XO&eG6z+3mO>3RjvzB5cJTg zZODZ=ET6v3`ZwqP&4z!^|G)Yl2hHDKgmI8JO{I>Lsod7(EnW{f4>IwV?tl?O70V+W zc!pEPm67a^akpsyixS#y%f73Ev&D}U*crb~FaR58jDWyE8U%C=3h`KVMFQA(1fFi<9 z#c-%To9n=PK5WlzrhXCn-ylm@biKfI4);O{jtI8`p30FJH|JR}phK?8D+T9JzA1N{ zcuEr}llP`u#|rmZa#il+_P_74DE5W4g^1;mJCQ2c^j%wHG0}1PoyPE)~hwt;QkKz z-+K}90PmIlUd+!b`P0T1a|h#5ihG;2C&O1hy7GJQZ5dd-=XWh6!V>Edwd*ADrVn=1 zA82nbflSVGiOWgrwRgqbZG!)Mmcbo~H_R1ccA_J+e&#>fbZT8fCKcGe# zg;9m^z`{)@I|Qu;_Kx>nd%KaXT?xuz@_6v~34=ksVeE!`J^`Flw@yojouw>wN zQ511r&Ov^@e<Q2+8 zsEFm=c9C-Ze~(w{<*I)ztG9XBP^FU+-9}xhmsn2^V;@=~f~5*sD&`+=lB77j=lstc zHPWhNlgJ`>Di3wm9$i9F!dFCC*TIALkP%swvDJ^)qiNEi@|C`<__)7IQJPv3E&@mG zXfE%zp^{xiL*)&40*$P8N!P0%fUzXaEUkJ%b^juebgm@)V?In9CIV;qiK7QC`%GTR zN>&;D*7LWA6=T}|C1ClL=;1!#HAw7ed>YdJ7`90DWGOx^y@(rU* zY5&W{jn*fnPSaE9w{H?*8>FlLM1I76)!hf}RIRC}t=~qPLIOfxj=aFoglliatGHh_ z$Id?cXU+eQeAoZWqGJ75)IMa=yg|em!nDh+(p|wnW>`qr2wVt-uP9Bv+YgA*+>In* zN^^!^jDnMjtTo{JxPLiXxmtzJeEPgc4T9?A`Vv{@)=aTTw-6~N74#8W5?B(uk@4p{ zdB=cKbaJ62SBRRO$2rK$$WBQbYc;Vd)Gl!CXVkP-Qx(#93a0?M z%HLTVk2p_X{&o%}YUzv*-E1BWMio$vctVTu_gHF`RqJk+X(Bu5K-(_a`a@%d*L_Ir ziQH*SlCqxzRAaFAkgDEUaLVeIEZH~0`Cv=;xRb5$T6_(u6K*#nqAPY;joo}R$0_!3e} z8+YQ1*CikY`@JE14n|)@o3Nc|ax%=jepYYCYpw2Pt#0v} z>&~u+UN&yGnJ4TcLh^PeVJ`dR#-FVGLz9IC|G{LzP&#IGv=>XBmNI@?P@tQFz+azP z*gGDQaW(5hw+q(cL_MCI1O+78nIPe{jh0LpLX<_u|G|5G_n4kVc|cin(wQdD`NmrR>Gi71f@ zWoxPCL@I0!f!Z~Id_V3}aq-f$!tEVDpK-G)9FE-H+iZ!x2%SiE;w+Z^xopU-r(kiq zG(shi`Q0Q%r%o_rIbjT9ADH|EvcBdD_xj~IlM8X(5qX+2702{wBYrPKV^|@S%(H)z z@-)5!TlcL5#S(#(6Q~HjVjzVd8IBxbZXL+R#9Q4TS6xkPqm>RUaGh{E==r_qH^9Q9_&4v8I?4AO; zJ?K@VzoAOu%8Be{Oa$hf2c`($ZS@Pr$nS@y4=+U(A)ll&Q>*HsjioTWaiP zI9p))Q_}tW?lN5W@-D#v_qX$_6AlF*oD`Gmjd}~F6UmiQ8*pGxuXn%eGgRy=h_u(K zxym~YUC$wtyuvpQ)`QVhUrVsvLa3d2eUBt4w%pj)-YD;-!Ov%hG;$Iw{*1@%^0dLb(z11JZ8vTcx12n6p4o-? za6oA6<3FF$qDWBn5ZD4EWXnUE)&(cIbq&lF_}pmDEm@3(h%JogA)NTCZnlv%m3QUQ|tS~En(+8l9{R8FKSjl z9B0O<_I>Xaw&p}ek;7Ce%?$ulfSlho@Nn*H%3nyqF# z_joK$o)fSTNliPNnvHPzt@;5OHClQHKC`?xj9i8H?img}+tgbXF-;~<6VsbyIuW7$ zVDXY1yh#vr^$2p8^V}Rm=014zN;i2S%nR=P(*)fPO<=0^mYAtPjYCj!6VqO3`l}VR z%*%Iu8C5p*vy3dzLlU8yJuW)LEr(og5SM#dM0P!NCO_N@)|GCbiUM&62Yr}%32jVf zM2FnZhGRd`qWAX;1_KVc$|-1Mb}PUkQKhtUWz)&^Eg)s7nJ71|kcJ!d`n;!21=)Wx zhq_lfG=amt%wjU``FR@~=|H0CI_Sc>LvU~g;i~w}1$OqMInf2B|5ZLh%$&!6(2Ta($X%X0 zbo$DIA{$zgGBsbk3Vz#snYLB2I(q%%9pW1MA2p;q%MhAC#k{gFiLPZej!}Cdo{2tU zv})*kLW{vs@-d3^xORHAwOo3&21U46QBX7{<%Etm-2^2ExALx%{%QcpJx?U>FtqbB zx|!Og)elq__n}Yc9Dw&U1;?4NvF(qd`%*u`H;=;@8dSqENL4PvNV%c$rglZzNu?M} zE=}0XS|I0L;*ipBzOAX`ZlSQosx7~}nFi?NBbk7dD`RiStwnW-#RtTCaasYYY2?<7 z!KvgM?vFA;o~|5MUw>+KJY)tJHLvy@POv)$ zv{DSvfDXMb@5X{(ESDCvGlXNJXqT2fX4MBcFYlIfpNTX@lTU`GfoO_Ik(ODGVi?euv*?gDxfe~XCq(6E)Yxm^U;H)F71 z`pq=*9GyI00#2?;nCdo7fLNHZqO-6 zR^h_J1KZ?_Z`PgQdBzX9pv#mErcOR>PuIT zMV4iTTp~u5j249Eto@OyBg?e-5ON*u5#G@v?9tEME2#WuN~zSZZAS^w;G z)|jzS5+ab^iNN}Jst#}wE|t>B6<^^cU3GcX&)>p7sT+I{$n$X{y#45205nWKXI;sp z*82&&x19Z%o~=`bu8O>)!PHr<`s97{tmy?C$uW91?c@Rn9L|2FV(Q@#ZbfESiu%Lh zLS}8^g;Oa`P+Rk#n1v{t!ZSX2jelDX2IbjmN}0qt6C3cqWJqNdltMJurbi$MHg2MA zaO)Ym#1#VqS`=BghGX4q&1Th6tPt7Yu?v@Ak+*ld#$~12#R}ORP;W;@V@H?bI#QXN zqPAcn!^WgdoT(^6F{0}>=q5?KXZ}vJC9M9kL5zcd!udqNP6o^V`pjfX>w$^a>9Om?$_jiv<5}vqqH>9LS~1+zjkOOXt=~@G zwqz;qUN;y)r<%HS^A4$V!$iPEtKN;3I=A~>?ol3$Y1FLlz1dS~eRAUu81R${ozrlwCrF34LRYcScFgw+ z?2D7R(A(eM;NKDn?RG_1Aoe1V?*Srtq8rhh`#k^ zK-z8Ez^Gu%VgIjDO{O`$B7cNL;pQf!$s z-j5p>SU|a6xP5_t0?Dm^QQ)T~DyJ$8;A-fNM9cuu&i&U!-=)H7xl z2TcZNmP0)5F5VrIU_jJmsPb zLCbIN8KK#Neq0xsco3)mqGx^V2(Oz572j&%;l1VKVeK28*KwB4(vFFJf%JYw>(l$X zvgE((sm$v5TeiiGm;S&UPNEJpfzz^?f)=2y?F`u{Ne^$WLYnY8wP6Fdq+?YM2et zH~8!eqPb}_fy|eSu!jbedU&-!Of8t8Sj>{pM{`q~*5oHeLsQH|Sk2(lg3uykP04`E zlVFof;lLKdnl7T52{}h!0srNAPP#C3?>O3b+4j|e^i1R4aTH{0qZHk=V>WBN`Sa6y z-3^Kkb`6eUPIZ;EW$7KfC!2(o^^chO{jd6O@sbo{P3_#uu@jJSys69&sd)rcFPID${4*B6dN_n!o?#-(g;;$VsR>g{u z9^^Zao@&grK{WI2Z8&U4t3$mTV=uD*569^HB?#rhm7spbSNlvlW&KU4G1R>_7vL%_9Gxtf8cb1p9L> zH-DB)rHdV}P`BM_*Pv{yr=(qL3GWAl9bN4&$!)Xm5NFs+n-pdRQ>3*OA3?~yp!QwT%oVX}F(WC5d5{cKuOVeV`1^lU&Hfa~^eYoA8Pm(FA1r-XL9o?Q? ze9%(POFCheNxp@IoXVzvrb#A;JDSf@iw4@Sdgz*tN(25ya8`Yke5bi1TQa5SSBT(t zOSX<}L4`K)ER_4j@4HaG941T-6Ktmwaw!&p?t3dr>L&i3BnolYw zDaAj&@l!1|EllM_W4*{7%B#4V+MG6o^9U)rZh?Q6sZ4+J<*MHL#LaTNOlDDcD7V40 zMd_JTh*b!&Cwsr!70XF07N>{cu)|0|3HYAa+&{yxGMJx@l@I{1a)f4 zgpe*W-#S|$-yd3@W@P6&GYXlhY1s-0Bi~um@}9z6L%8hBK9hQwdnM1eIQ|-fj?=xc zz6LSlThloeb%n2e0-7PiEBT32ui^{EkeL3Ek7M=eAw^GUfjC~wX*~X;H!~c6Bu;DV z+_?imyl?}DjQ_iTIG z4UISN%c&{rziRu+y2@vH#QEy3e&wAhIXv zkhcwuQ>h3ST=LTqxvZm)lef(&suv1q)JA+6#>?-uQ)e^*5l-LfB*zJ_Pe0nC*cB>P zL0^YvO;%^t&SI>%dU8V9M&@ckC!bCZcUZTlAM07b=Zs10A7_wGoZox88P>gGUv)(D|Glk`r~NKR8EX;C@;U}q#Dl*Bj%)M}2!11I6PIkq^mMEw zqk##%k!bsCjI{B z7DSlIAEIa__1A@5=8n3Y1lK|}nk(Xcm>F4>>JVJ*W-cg)kCY&YDGfrIbjWNCg8=$O znE`h)QI`4kUMh7Elq`p^pDc#;AG-LbZ2kKJ|KI#u>knvMltT8HjDf(CdA?nvq+YfX zT*vUm~H0DGL=K30pycN4(to^ohj;(T&1^DO54)O-6kth?S6<&`8E)Qyo>Xyjz3v z7um~apCC-74{Hh!qgSk*_JS#g&B5G(*h$8grgBc|_x8?2BI%&VOe|^xC57HRY*JhQ zO9!u{<!nYM)-3 zCA}xNwSJ|XaRyFJ=tsES z+C^kB>_6W6M>Q@7Fjf+IzF$fGCy#p2NtwkULHMWH4w68pYfRK!T;{rK*`T=gVS)TkncWkUtlIcp@jW>gy=hf9QkHy z-Y*CgsXb|RbcuHO%szboGzH_^LjWZX`5vpXu4@~3M&C$w^xV`};01=27POs?T0-19 z&e|e4JCHdH$Z1UXX7S8cN4Nw^ee&r!BLy+V+INP zPhw7%i6Kv{3}+X=8P8?~vG}DOgkvpG;N{&?)LMoQ1)&)|GE4vvHevU{PV5VIoiqy^ z_5>A$PCz@vmWK8D)Ntfk47h*DC2rPpua&g7;IK~+9$e2SVGKlcEQD%Lk4Za=Oq+H; zeG`1}<1<>OBuH0;g~UaVa(?XYWMfm<%Ib>8&W=n44bJV!Y@={;{Y^wr=;$(l)H&0h z>jHGW$hQ04&2yIk~ycFnK$}k>gX}n-YFt$gTDK z!PQ#|tNovsNHS}cQ^}i!Z_SNkqJiL@)z3vL)k`>vJMhd7cVeDZDpM#=gnuHPkjZW| z@L=`akS*oJ-vE~eOUyV2V>r;8Pp4|vz2NPt@%2bw&e3!e<|8gz7~V6nUXD&K+>M)* zOgWN#Mpc8jYGNvvBJtekadDbzLRV1k?bDdhJLVMp^kX=&5n-IF)5#`0^T8;=A^p-` zG32ce-8QRRr<+q-X#rBdU}^I_=K;#XSREun{e&Pg+F8_mGN@(Kd90UaUQ+*6YmXm^4>>tVe4c(^ zazz9`m-3Wae3X~fD>V#NRL!aP=c_`B@*QB8m%XXCH+z|8N$0kUp-V)CG&sBj%cvMO zt?|b(m#1FtZFBuxEv&0fxLpgPP*MZ?2~>6wAe}g@_zzlL>A~MCx#FXJWoUx{{!K1^ zebi_Ueyb-0kQh_s9&!=(^1xAD(Ex;`0P$FNhVZ*J*?!f6a5<2G6Hm;+Mb*5tSFzyW z!WzWe4Pvm3J84_ZV?`4I)}4%&8aT>=XX*klT|a|}7iPV~^r}ES*3@@&en`P>S{OaZ zX(0u4LWHN;IQW8-8{i-%FX-vBwDuM+}Ou z=Ln4XhhFku|1E`B+rY!-#?7HWav(FVbo*HD8cENbspN4z?vRIOfZ%|aux;t!y=wXs z$Su#&y+bOrZuT}R;1QW=&l%AXBP}H|vWp2Cebnc!Mr^=JV$ov>COlfD8O^yjRI5|P zfESyBknJc-?u#T-9xnr&f z`Q~b_Ay*BBNywNoxpGX-IX2sVtKaYQ`26#JJU;)u-;d|#`Fb9o4@0VwZ6658Rt!Au zV&PmdE`P6&ofdh&G`5|5t~%&M$m#YM_~{NTFp!;zUw#lt)Vg&hkurzz(8h$W_Cse1n;hk7 zKPZ}Of4EBMe^3+KHDIWkr!fRrr>BoP=7EX7qm)o_ezlBr2LtbYf_5_#;p91A3tUbI zQuAGJv!D>pw=}xgU@mp^%y$@6ZC=IACpz2P@yPy(D23fVj9c#kwAdrVAg;(^En~V? zMtc8k+8c~z&*}K}VHQgzyXs@Usb_{t+IY-e?5ZUH2ecdcKGd7Vi@_bs{lb}{y9phw zGVKxI1iTs7Og$!kn+KX5tapkbiVl_3u#{!DqJFWP1XY3J&0OrK^~Xy-=SUuG)mulYm-w!VnUy9 zBhgr4`{Qy)n`^;gok3>@^^)+9;U=C&LDRFl8Vpe9*Ia_;a?;4**Vn4Iw$vf<`j3Fc zIh~BOE_G=5=CPYOBBx9M5jOIjm5mBf&ky1oQU>1>_9Tzx17Z^j<*j$mte7JUfPuFJ z+}qA>IoXPtGP;$6KOD@igb%=geb#?P|20#iVppw;Smy3{72C#6ee ztcWy<#y-&l_l?Ok{oXF(g0kX;butR*&N)KI7U0d==&SXN6?q7#MGp*ZF9KQ~Y7jXF zKyi`T`VpYC)8Valm z@6!GLweT5>k_IOsvVgJPzvPfY#fE)e%$+!s4-P-z|JHx>0p%`(e%c}}&OZPrxT1~R z?KkSOy0%Yp24=|_wocRQ3{8vyMn-D?oTJD0R#S^$!)JZzEPDwO)BkB?$xf8 z-mf+fcdnJYr%75~4?!g3qi{FsA47>V*P&foVz+D63s2`5j>ZfRYoHNi(m$%QpSU*` zqKA@|jWWj^3(hLyE=3hA*%G1-&9I1bw{w6cS7=t14(;Z&ndDKlgoFQZOz^lh=Rw#} zn!JvbV&WCWNvTSs@ABvep-)&T20mB5eyG5<{ZbwnJVKQ`zdlM8 ze*mU+&UJ!p-odYCa-HLCt*}MJ`EWlCw>5knn4Q%T>lYnfu<|NKr2$$yws3oUM_?!Ejl_JHrE>dSIymBoERNWa)i~cS%B}2Qw&%oKd}nQ<&YfHejo+df zRIOiw_%qv~@zgDawI>;ZAjho9gIgT=0ro;4ldiHx&gz{^@=uda#d-LtqV*M1{6%f0 zPnV3}SL!g%oSJ+l=G)+G*A6${N>{Y+Td;)KwbYim_6pm4d?1{=K&%49KD*T1+uTwe z?#UsJJ8`-tb~p+354>)in#*3G_#Rswf^LtNSaogOXn_fAo>GgksD3|i(w;)^9y{x6a*c|&he1z`N`e`{0#!1>Jup@m;dd&5PUK1?oKyEA68`uiQfZaP;x%=(< zM*JJvg&hLvFnPY`o$tE@6GRu->*%ahG!V(5ghEJC_imxOm z4%x5p7!1;#RW$5x#?n2y$qs7)+IA6D_3_)N9m(SQ{%2N;KBU*j#GC#QapK9xH$ZJ~ zUWZxHG^N!sk6ThuK^qWu3K<19$V|bUB?|JEduhh~vlX@QgFp|pjEis^)5Zp4? zbRPrZfmgPmQa5kH z-+2vxOXVczHE{kf{3@UP%EeYBQXCD)GwIA(cps5RCYkZ?;uiWsDbW`b;2TMGIP z>c!h+r#P~HA4p!E^-S#Dn)*z-7HRXuhQ^FP^!eg^UU*OX$)d6jR=B9`XgH)!Fztu_ zO??2|BBrnL^gxE-<$XPIUgW?px&CRYMdr~1AFH+nOjRs8{-9KIO+(_u=ip`YQu#V15K8-sBGBN!+ogz2@nnmF2P41N8gyyGP~yhICg6YM;bm)d zRvyFaR8yNR`x4E_z`G#Jb{_&B^nZ1UjoaxsroIF#n4Md*`)ky!ncS@v#?1@jIsg;8 zJnT^rtx(CdAMGM_NGt4jO!~>s!d$~n_gu9ze9YHLF`6bEaBP0*Bk%(kJ|JR59e9Ht z9C(5e|FT9`0Pj!#wQppF)id*A)#DkLzVCIVObIa&e|!53Z5t_Sh}-jq}+VM=TKkQrXPbl9U^spSVV3H%gnPmMW%yv zpJTelqvAuI97&OGCm|ED7lQS`@%dK(XBq#{XTV#7``&#EgLwz0Fl_ZQ;<$FGM>M6} z7+Xmg6#-4sd-&(?a_E-V!Xx@!t%E2=$Si%6Yv%j%`kRD$J$!q(S3-a4@b>K-CaVo2 zz5%ki0*Bp>y9+@f#on^nUlw=kje&-il8k}`B8JMch_~?1Ughb?FhCZH9chZ)e)%l& z=#07Uo&@`}ZMe_5nV&mDZiexAF0vKE4Xsu6t_^O(nveazq#ZzWOb8sXU^%+FaC@{7NsNO*s78D#PQ+c+Mm!GWQT) zXah)5mBEd+EyHxZOtug^e}!<*B)@N%UA--yGo+)~$nZvKS%4c8>%$5iUNnc?rQaiV zoDHd$XIMXJ9`5j^G<;*ubH8#paDQo&k+6+M&~N5xm8o^+2VmDy*R#r1uQ2x{dGf7k ztRicGNqy%)ci(#XGBR)j!QvD;CW@^JPV-I0J;eLnKNoCM$ri29(y+s>3(?k!tVZw1 z^sCW&R9{bP*MF?#vnSpBM;dovho($lC$OSh)oLTH94pk?Rg`q}uGYMHv1dGs_xedr z#ccn`dmo+p#_^ZN4y!ubi`2KrsdefS4Qt(}$LBi>P7wss?cyoI+G4oXIlq$w-VSns z?*@-%2Mqszv$#H>jdm@gdF%^i?&+}~CJ4Bj03fQbmrO*UhL3=MvTEamjjujhppGv}ZQ=4((q{)wZg_Iu-kADfq@mAOvP+rndV5hv*G@Dx zW2{0}udW97HNJC%fgduTI=u06?eUI5;pD0p1ii~wG9Io`4S0J7=l&*f!q9w_T)EDg zY8ccfif1cdld`1LT%RgUXkKm!a+Oa^?dgi)h)20>xs)FPgs>UUk_R6M?{Uv^vQI5> zS}teiQT-ydVWy?%q^;&9gtdz)oA<-FM?fQrS>^+}K$^aO`XVDtdgj;DxG-UxidbRC zhT)D*V>p^JqYDTYFkDJ{1D&&gd~|| zm1}A|y)1EP4;eNb``Z#wDXMsMB;rfVk)|I61C{6upiz_3R4p-EwUE1q(v#@tT0eI? zlj%_0xLvt)Y4&li7t}jeb^z4)PE;oDmNtk|k7xH!ectVJ+NrAiZVJG?WQO|5x_9+e z5@@A(su)DC{YzBA+MG6;`Aw9sJT3`xub*N;lPTh~T!|K7(p#i3sW$<4A?=I->eAlo z$_tasBA8Mm)_lyZR(#{_mrY{B{q|pwK)DVSu*uLE(7u{t+%yEMMB0m7UqvLZ_{S>! z@c`jnH(Z%ta1a031OVd*|>%X#Qp-_b*^Yi?2i}I0yn%+;PLjj%aJZv)hgpmxfO4>m4iPyd!8>Fi&k>iQN`HT7-pQC zdWpl9Jc?ZUx=cS~zuCi+et5$6$~<4!I&ZB%Dv%%iQJND(g>`8_trk&!1`}`SftQ1I mLrQ<%+v58BkA1O?X7f&(TX|Ld>c4e_b6q#JhSpqhOZ+c9MsR8X literal 0 HcmV?d00001 From 896c8d34913e3db21012707b471b21f9de98a495 Mon Sep 17 00:00:00 2001 From: nf-core-bot Date: Mon, 16 May 2022 10:19:49 +0000 Subject: [PATCH 149/169] Template update for nf-core/tools version 2.4 --- .github/workflows/awsfulltest.yml | 3 - .github/workflows/awstest.yml | 3 - .github/workflows/branch.yml | 3 +- .github/workflows/ci.yml | 2 - .github/workflows/fix-linting.yml | 55 ++++++++++ .github/workflows/linting.yml | 4 +- .github/workflows/linting_comment.yml | 1 - .prettierignore | 9 ++ README.md | 25 ++--- assets/email_template.html | 142 ++++++++------------------ bin/check_samplesheet.py | 16 ++- nextflow.config | 2 +- 12 files changed, 135 insertions(+), 130 deletions(-) create mode 100644 .github/workflows/fix-linting.yml create mode 100644 .prettierignore diff --git a/.github/workflows/awsfulltest.yml b/.github/workflows/awsfulltest.yml index 77cdfeac..fc6eba92 100644 --- a/.github/workflows/awsfulltest.yml +++ b/.github/workflows/awsfulltest.yml @@ -28,6 +28,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-${{ github.sha }}" } profiles: test_full,aws_tower - nextflow_config: | - process.errorStrategy = 'retry' - process.maxRetries = 3 diff --git a/.github/workflows/awstest.yml b/.github/workflows/awstest.yml index 9e958dd0..024728e8 100644 --- a/.github/workflows/awstest.yml +++ b/.github/workflows/awstest.yml @@ -23,6 +23,3 @@ jobs: "outdir": "s3://${{ secrets.AWS_S3_BUCKET }}/nanoseq/results-test-${{ github.sha }}" } profiles: test,aws_tower - nextflow_config: | - process.errorStrategy = 'retry' - process.maxRetries = 3 diff --git a/.github/workflows/branch.yml b/.github/workflows/branch.yml index 5eee8118..80f9161a 100644 --- a/.github/workflows/branch.yml +++ b/.github/workflows/branch.yml @@ -13,7 +13,7 @@ jobs: - name: Check PRs if: github.repository == 'nf-core/nanoseq' run: | - "{ [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/nanoseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]]" + { [[ ${{github.event.pull_request.head.repo.full_name }} == nf-core/nanoseq ]] && [[ $GITHUB_HEAD_REF = "dev" ]]; } || [[ $GITHUB_HEAD_REF == "patch" ]] # If the above check failed, post a comment on the PR explaining the failure # NOTE - this doesn't currently work if the PR is coming from a fork, due to limitations in GitHub actions secrets @@ -42,4 +42,3 @@ jobs: Thanks again for your contribution! repo-token: ${{ secrets.GITHUB_TOKEN }} allow-repeats: false -# diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bde19cf7..88e2cfcd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -48,5 +48,3 @@ jobs: # Remember that you can parallelise this by using strategy.matrix run: | nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results - -# diff --git a/.github/workflows/fix-linting.yml b/.github/workflows/fix-linting.yml new file mode 100644 index 00000000..18e9c23f --- /dev/null +++ b/.github/workflows/fix-linting.yml @@ -0,0 +1,55 @@ +name: Fix linting from a comment +on: + issue_comment: + types: [created] + +jobs: + deploy: + # Only run if comment is on a PR with the main repo, and if it contains the magic keywords + if: > + contains(github.event.comment.html_url, '/pull/') && + contains(github.event.comment.body, '@nf-core-bot fix linting') && + github.repository == 'nf-core/nanoseq' + runs-on: ubuntu-latest + steps: + # Use the @nf-core-bot token to check out so we can push later + - uses: actions/checkout@v3 + with: + token: ${{ secrets.nf_core_bot_auth_token }} + + # Action runs on the issue comment, so we don't get the PR by default + # Use the gh cli to check out the PR + - name: Checkout Pull Request + run: gh pr checkout ${{ github.event.issue.number }} + env: + GITHUB_TOKEN: ${{ secrets.nf_core_bot_auth_token }} + + - uses: actions/setup-node@v2 + + - name: Install Prettier + run: npm install -g prettier @prettier/plugin-php + + # Check that we actually need to fix something + - name: Run 'prettier --check' + id: prettier_status + run: | + if prettier --check ${GITHUB_WORKSPACE}; then + echo "::set-output name=result::pass" + else + echo "::set-output name=result::fail" + fi + + - name: Run 'prettier --write' + if: steps.prettier_status.outputs.result == 'fail' + run: prettier --write ${GITHUB_WORKSPACE} + + - name: Commit & push changes + if: steps.prettier_status.outputs.result == 'fail' + run: | + git config user.email "core@nf-co.re" + git config user.name "nf-core-bot" + git config push.default upstream + git add . + git status + git commit -m "[automated] Fix linting with Prettier" + git push diff --git a/.github/workflows/linting.yml b/.github/workflows/linting.yml index e9cf5de3..77358dee 100644 --- a/.github/workflows/linting.yml +++ b/.github/workflows/linting.yml @@ -48,7 +48,7 @@ jobs: wget -qO- get.nextflow.io | bash sudo mv nextflow /usr/local/bin/ - - uses: actions/setup-python@v1 + - uses: actions/setup-python@v3 with: python-version: "3.6" architecture: "x64" @@ -78,5 +78,3 @@ jobs: lint_log.txt lint_results.md PR_number.txt - -# diff --git a/.github/workflows/linting_comment.yml b/.github/workflows/linting_comment.yml index 91c487a1..04758f61 100644 --- a/.github/workflows/linting_comment.yml +++ b/.github/workflows/linting_comment.yml @@ -26,4 +26,3 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} number: ${{ steps.pr_number.outputs.pr_number }} path: linting-logs/lint_results.md -# diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..d0e7ae58 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,9 @@ +email_template.html +.nextflow* +work/ +data/ +results/ +.DS_Store +testing/ +testing* +*.pyc diff --git a/README.md b/README.md index 846900e6..862914d4 100644 --- a/README.md +++ b/README.md @@ -1,18 +1,19 @@ -# ![nf-core/nanoseq](docs/images/nf-core/nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core/nanoseq_logo_dark.png#gh-dark-mode-only) +# ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_light.png#gh-light-mode-only) ![nf-core/nanoseq](docs/images/nf-core-nanoseq_logo_dark.png#gh-dark-mode-only) [![GitHub Actions CI Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+linting%22) -[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?labelColor=000000&logo=Amazon%20AWS)](https://nf-co.re/nanoseq/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8?labelColor=000000)](https://doi.org/10.5281/zenodo.XXXXXXX) - -[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg?labelColor=000000)](https://www.nextflow.io/) -[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?labelColor=000000&logo=anaconda)](https://docs.conda.io/en/latest/) -[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?labelColor=000000&logo=docker)](https://www.docker.com/) -[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg?labelColor=000000)](https://sylabs.io/docs/) - -[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23nanoseq-4A154B?labelColor=000000&logo=slack)](https://nfcore.slack.com/channels/nanoseq) -[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?labelColor=000000&logo=twitter)](https://twitter.com/nf_core) -[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?labelColor=000000&logo=youtube)](https://www.youtube.com/c/nf-core) +[![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/nanoseq/results) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) + +[![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) +[![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) +[![run with docker](https://img.shields.io/badge/run%20with-docker-0db7ed?logo=docker)](https://www.docker.com/) +[![run with singularity](https://img.shields.io/badge/run%20with-singularity-1d355c.svg)](https://sylabs.io/docs/) +[![Launch on Nextflow Tower](https://img.shields.io/badge/Launch%20%F0%9F%9A%80-Nextflow%20Tower-%234256e7)](https://tower.nf/launch?pipeline=https://github.com/nf-core/nanoseq) + +[![Get help on Slack](http://img.shields.io/badge/slack-nf--core%20%23nanoseq-4A154B?logo=slack)](https://nfcore.slack.com/channels/nanoseq) +[![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?logo=twitter)](https://twitter.com/nf_core) +[![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?logo=youtube)](https://www.youtube.com/c/nf-core) ## Introduction diff --git a/assets/email_template.html b/assets/email_template.html index 36ece146..93137811 100644 --- a/assets/email_template.html +++ b/assets/email_template.html @@ -1,111 +1,53 @@ - - - - + + + + - - - nf-core/nanoseq Pipeline Report - - -

- + + nf-core/nanoseq Pipeline Report + + +
-

nf-core/nanoseq v${version}

-

Run Name: $runName

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

nf-core/nanoseq execution completed unsuccessfully!

+

nf-core/nanoseq v${version}

+

Run Name: $runName

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

nf-core/nanoseq execution completed unsuccessfully!

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

The full error message was:

-
${errorReport}
-
- """ } else { out << """ -
+
${errorReport}
+
+ """ +} else { + out << """ +
nf-core/nanoseq execution completed successfully! -
- """ } %> +
+ """ +} +%> -

The workflow was completed at $dateComplete (duration: $duration)

-

The command used to launch the workflow was as follows:

-
-$commandLine
+

The workflow was completed at $dateComplete (duration: $duration)

+

The command used to launch the workflow was as follows:

+
$commandLine
-

Pipeline Configuration:

- - - <% out << summary.collect{ k,v -> " - - - - - " }.join("\n") %> - -
- $k - -
$v
-
+

Pipeline Configuration:

+ + + <% out << summary.collect{ k,v -> "" }.join("\n") %> + +
$k
$v
-

nf-core/nanoseq

-

https://github.com/nf-core/nanoseq

-
- +

nf-core/nanoseq

+

https://github.com/nf-core/nanoseq

+ +
+ + diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index 5473b624..3652c63c 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -98,7 +98,7 @@ def _validate_pair(self, row): if row[self._first_col] and row[self._second_col]: row[self._single_col] = False assert ( - Path(row[self._first_col]).suffixes == Path(row[self._second_col]).suffixes + Path(row[self._first_col]).suffixes[-2:] == Path(row[self._second_col]).suffixes[-2:] ), "FASTQ pairs must have the same file extensions." else: row[self._single_col] = True @@ -129,6 +129,16 @@ def validate_unique_samples(self): row[self._sample_col] = f"{sample}_T{seen[sample]}" +def read_head(handle, num_lines=10): + """Read the specified number of lines from the current position in the file.""" + lines = [] + for idx, line in enumerate(handle): + if idx == num_lines: + break + lines.append(line) + return "".join(lines) + + def sniff_format(handle): """ Detect the tabular format. @@ -144,13 +154,13 @@ def sniff_format(handle): https://docs.python.org/3/glossary.html#term-text-file """ - peek = handle.read(2048) + peek = read_head(handle) + handle.seek(0) sniffer = csv.Sniffer() if not sniffer.has_header(peek): logger.critical(f"The given sample sheet does not appear to contain a header.") sys.exit(1) dialect = sniffer.sniff(peek) - handle.seek(0) return dialect diff --git a/nextflow.config b/nextflow.config index 7ed2e5c3..f0a21191 100644 --- a/nextflow.config +++ b/nextflow.config @@ -159,7 +159,7 @@ trace { } dag { enabled = true - file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.svg" + file = "${params.tracedir}/pipeline_dag_${trace_timestamp}.html" } manifest { From 4b2336d45e2a1c0345e068d013cc5a9f422ae9e0 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Wed, 18 May 2022 16:10:34 +0800 Subject: [PATCH 150/169] PRETTY! --- bin/check_samplesheet.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/bin/check_samplesheet.py b/bin/check_samplesheet.py index cf4a68ff..4ea4165b 100755 --- a/bin/check_samplesheet.py +++ b/bin/check_samplesheet.py @@ -25,13 +25,12 @@ def make_dir(path): if exception.errno != errno.EEXIST: raise exception - + def print_error(error, context="Line", context_str=""): error_str = "ERROR: Please check samplesheet -> {}".format(error) if context != "" and context_str != "": error_str = "ERROR: Please check samplesheet -> {}\n{}: '{}'".format( error, context.strip(), context_str.strip() - ) print(error_str) sys.exit(1) From f601fc7f761943f3de55ef50b130c86ff0613b7b Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Wed, 18 May 2022 16:21:36 +0800 Subject: [PATCH 151/169] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index c027634b..eb4cc213 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,6 @@ [![GitHub Actions CI Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+linting%22) - [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/nanoseq/results) [![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) @@ -16,7 +15,6 @@ [![Follow on Twitter](http://img.shields.io/badge/twitter-%40nf__core-1DA1F2?logo=twitter)](https://twitter.com/nf_core) [![Watch on YouTube](http://img.shields.io/badge/youtube-nf--core-FF0000?logo=youtube)](https://www.youtube.com/c/nf-core) - ## Introduction **nfcore/nanoseq** is a bioinformatics analysis pipeline for Nanopore DNA/RNA sequencing data that can be used to perform basecalling, demultiplexing, QC, alignment, and downstream analysis. From 2fa5b401a4a54c003c4d83ff738f82f9fee74eb1 Mon Sep 17 00:00:00 2001 From: Chris Hakkaart Date: Wed, 18 May 2022 14:05:08 +0200 Subject: [PATCH 152/169] Update ci.yml Extra line causing issues --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 31c00b26..2442b2b8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,7 +44,6 @@ jobs: - name: Run pipeline with test data run: | - nextflow run ${GITHUB_WORKSPACE} -profile test,docker --outdir ./results profile: From 8bd5de5dd5712fe3c15043cab94dcbabf5ff2377 Mon Sep 17 00:00:00 2001 From: christopher-hakkaart Date: Thu, 19 May 2022 15:42:32 +0200 Subject: [PATCH 153/169] Fix subway map --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 146167 -> 146213 bytes docs/images/nanoseq_subwaymap_v3.0.svg | 14 +++++++------- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png index 39d86662ca53ee88069a6c1d0069364201e593f4..90496d5821c09e74592a68ae4f5cbb9af59103f7 100644 GIT binary patch delta 16559 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 delta 16514 zcmX|IbzGC}_hz&L!azx>Q7YX?icXY%5$Tlf5NXD91W4(=_joktYv{o2&;GdYzSgZa zK}|3Se8Ei8NZOhu3Z(fn3i;xi?L$2_sXRD5txG#0`hHTD>>W-SiaTk;cwSGO*^eJ4 zB2RL2Hqt|Z{(zi-77w!@>L!66_CMa&qrc~^r|gN@yg?)qzpUnXgowAt-O%UFoOWe# z*8b)LQU~s56_qj-D1FmhTSpaLZ1Aiib`*y{5a5Du(_xA{Qn*v5JHhzSF#XnXDk1Fz zLG1+UkAy)28rj*o>Y*1r{%ILjK`x~BkC$Dp9Ql}|&KQe?+nE#}JO8K(J|FjgN*j6xV zC9*=uBAAc;B`hx;8HFX=&_%R4oB-Fcx5DfMslO2*6T5s>>`zSR z;3~sxtAx4R;p5G_@>nM!*A^s~LqD#ryAMCBU;6{@ThytfHYZa9mjc9anZ`cj#TNXvxdXynJNR3tZhj>GPOoci9wML0W zC)B=Vu+AUq7p9-zw=PMyJ1xljaIrVZbwBKl|Tg3*3Y`hYmm_< zGU;neJXrgX1(7Q)#&*D&fo)j6f#Q}1MhhDn0%R!U(5BgCoS3Ui%I{6;@PtekYqplf zhE?~4nX1pbLj+o{VtB5NB?@sJI&#-5%Kg8W%ZE^xU$a=UU^6CA{Q|-pX+Qli?2^;S zg+x@|&#&%;O`&gUJ(LZ?Jhe1Ru_p*doCtMpn{+wgD+eCVx|M`ff=@^1!eq-*V69*wC=O4I|U8C<{;aU)+tD+gV3N<|shZ`~%Xudza7bZDk)L&Cm z^Z>A{c$X+&Bb!PV&SLncj8=6zZ=E)b8ds~gyJH{!XESPhhr+v7CQDt;cHAQs+hwB_ zg~&Ol3UJ&|zvIf~&9}PU-tmR#A9;573KiIX^qgOdk2jw_5XF3u@4lKcuBu1*yt{i^ z*J*OZ;_?v%_|^?c0;2=dmmB?s3JX1Z0AsqK zr)McD>A2I^qmlsoTCCfB^XI3Ha)pJxpXWJtOd1S#?cS#~8b2b^d?&akPz<%DWA$r$ ze4Z{_C8uy0W_8Lw$i$~CN}7$j9A8iBIdeaoDp-Dt%)m`ydu!jnI{%JkXhSC#0-LER z;n^X#i`ZnV|KQ65Q3auI2?nL<=a)lSr%DS#6~PONL44Hm5f_>gyLzab5XG`KmrU`u zc6-|9P#^)<;U0}l+5}(iBvuXso~#OjMEX4x;<}ljj)quP;gr@K-&QwNYxWV8$^8Pv zEs~|3LgTI{GoeYfYyLAf@*3c3Vw-Hsg1UEOUd)99&gwE7P)0+Il*#0aopuNK1jXfjS2Se|? zNFTky`Ag3WIkWi_sbN@*F9J(M! z6kp&Ec&;N75V_{U0$Nn216%ZnG9zZf;Q;ekf1nldc5Ob6wj{+Y*wiM15OF4oz&zFKy;aBl}g?-R*C~LeFB420MiNN&(nh1 z0oH7O4-yq*5uJ$DLC=F*!SC;i4$0D<({C;E?K|g{(M%d;DDb2y(8A*X8}Oax_o*+d zpqcjQpl-NS*U7Ee&+;I7?=q1OJT(+Te%emFU z{YpBqw2?y@|2wl6XDT8q?EahV1nRrZi#y-1c&k77?t}h#DttrBpNx!;OdG2CP*!(0 zlCmwDHqv#7N3uLXf2Q!oKC9g!8CPlw0kBGRuEDuHb=D%o(@gseL~{C3s?od@v*c9D z>{73^>deHr>UNjwP=4jw-#>c*$d(UdZF8<|4|)OCX1neGo1FWeLdbU4yRGLpdL(J8 zeG3jTFF*4ga6(g_h<^Cx4%JT7Yt>wKkdk(z!|Fdq;x+JTbzyhgik*;F#dwe%jW!WO=ZPv0XcN6u|^(}9R$}x8M zVCu^1ME!74uju&N0}tcAy-45Q!`6b~jhewziJ3*OZGg5{3}_mWPNC~YB%9|L1;g-#Zd26OUn&sd-J=kk6#m0 zfv2IpQKLXv+W9pj<^>k4eO9^4gzjJeUK?L|=shnFF+O?`=@syF5Ff|#0aw$h15^$_ z_ZBzYBnu6NYa=nf-`VX^8SB&3Z9hIXbmMm~K=N!4%$GNJ4mfX?I*jW;wUg{vV6cly ztmb(!`#S#{e87W=APwYS?XtvTUJ#A?93smLZ9-4d)V)eQ(o4j>N}JY>2KQ2}CJ(ZX zasW`roqc_H4>Lv)zFX24lKS_^^OxR0!XVPWX5K>;ww3IiXY6N|FL~{L9>nY7>O>8J zj;~>*16Q-5ALyg?O49ji!Lm^^;f zI1R1$`BViSL+Aa4ELUe$U0vS_Nt?%(N}vmEel0Q6GM)DG0IdDKVQ zk1q5$X11*peph$m#N%^A3o2|Rap<7Ny^}3PrPv{TY3PuY(oUbJG)(9)sbrqXNL^5R zPMe}(V!6R#|KSDk+TT~+8MmjbZiVMQ^lDw%SFsQI3@A77%cQQROq2}-(LwG{ds)R% ztm5{LyM!l7FFGWi`7DIzXm5J01VxR;*!IV#^863$o4@rI;DEzN+?^>S+do)S!!`Uk zwpiO`3o1eClTOFp@RumDIS1|7R=B*bcPh0(UNA?3SO}3je^^^!l^iWtQ{TNB!dDJB zCcju{ppXDfi;2rdcjZjix`da0Cmg-H-hdx!t4KK3WD0Zuf>osDnIiuZiZ8OK#4abT@@a|SQXYA zR>OBd_taV4WT+vV?;vmuxR)9EeUd!T~VW*!##FnN90>!9*R`vE%`RA*vQLD zs<0gTR~2p(9!%l#`LDj}*%Lm>tSX+|{(H0*B|lNOQgA->rO=?6zUyQz2|8`~Dx(3) zp-Q0uF0FMo913~V*il(unzT)m`1`gDM!9aR#CWPI*GYCk=x0)fw6*7dQVq1?$K z7{pkhz^glSiCuP9CRJrE)jlOTt|1*q203cbG{#G)?KKaAOCu>)89NoRmx|88c<=(=6LR&`mZ-u>!DDad9 z6dig=g6V@_8V+Eb?u|C6@ ztFzf%KXAZ^F+(sQ1mMw@lV7gc_wOC=y$JN7S-S*8&QqiL~EM?j?zB>@;;GW2}72o3UyihRMJZ!AiONnV`tTIS!09fGMLrWC!)El-c z1;?9IDeiB1|L2eitd9Hf#Wq_N19M5-cizR(D7e*1{?8nK0n%D!2(VI_YUg&6u^^lg z-iUVOAdfFaE}759oI))58H;&|OJs@(OvNuaF;Jgen4-IA!DrL)f4N-mLJu}a<0`Fc zmTfS|3{*ssD+rK}Hi9-mX9IEGs`RJtU2NH;w*=(+KR)ZC?3ZahgseFJ4T>3z3~%(- zD(+FY(gb8~RBV`K%7tDuZ*n*(b)TNX=DkXUZ&0s>QiM>3)OxDz2vrJwv;|J!UgVuv7i*aTsx{u6fK_PJhWvrr&LXK+IV$Fuh;5!G^Z8X z1R#h=rodNUDZ8pFBRDY9ru z#WjD0$$t(JA2WjOrz+)$bnan_Rll+}9`c_4`^yucXzh##Hd}BoOd-RFzg-FO9%r4J zM*Yn)ZS)sr(6(2$;m}yo^&l!2fWnu_A}RZc?l_w~tE zbRDsl+MTeQ@w6*$S(Dp(GsitUF32xC;H4vK^GvB~l<)BFZ&Tz_Wm&9ZPPvXEPfkbd zgPdNg>QL6nvcO|d^!xIph!{-HC}-YDELoR^7Vh^%?zx&lMi1nqzyPTL;O(t#w35E0 zbm13y2gT$hBCuiBU?*U${$`zi$(r}huAf0RVYfv9QI3+i-ASIyJ-P8GC4ARxVKc=>0IC0v9LPMziR8}@ae>puxys~FStTa;d| zWVob7?^{k38anEJxG3nij+r zMSmVNjX8gPzf980ilPAdc3&z93U&InQtgRU_#6rY>>5D_j(gR;0<`T3d&f^^eC&&c zpKtGNw#NJpK4>kn>?7E9frH*}_XW@9ECDPWA^GOtC=HG!%OESDUh zE~myAap;$bCpFhH+Y#p=^)V-vKWB$@l&>Dy0g%yuD%MXg zhMM}{WC?#R*X~i(jxGr8B?A6cSZh$b1%4iu+S_04D!4x-vsz&+u@MA-ei6Q(lN=%n$Wg+76P%X8u5o3;^C+Wllt zL_2JTQr7~tONb})hRR8HhY5^>WADG~H{kVcOJScs)}f#rSvwt9bH{V0KOVk+@0s=ZC;ad34 zT_w4}tfz1~kybUekpS@zc=M|vL*1p4LU)~!ucFh$`y4tcC?WW+L%H!d0iYe(m6omVu zbp^r~{=|LCj;143-A5@4CDqT}K~d#-*KTkqr@N-(bgd6F*6(swPa ze+Ye38!z!|*?lJ_Lq3^ML!qcZ7UYc6%~A6OQEc;ppr7T+W*C+sBM`xY#JH6DP)F+L z7@defMl+g=wnDGWcsTqs+=@6CkjYHtkE&gLcbxfJqj#W3%z+pEk`}H(Z*4@XO=*R_ z!w-SIV{b^YQp>Q*jrj5i-<2gd$Zk-u1CXuhG-o>YT8WqBBbpJ6OU*`k{nB`ceu*o+ zgPd938%D1pd-hC*9&Z|~id!brrb!x1vY&{9-`V_23)v)#xO@b?%X@A;O5;0t^h`f_ z0TF=o{9%FZuuEXC3zVLz#Ee5RiWAcT0G8!)C75IRZZMnrreT(u4R%Nx(C+rqqij9o z^MQKZ%c5}ZX14h5Tez-z`&5Dyln8dlnHR9;G-k}`{cI%u0~ou%UpN?c$X7wfB)?k; ziF{cKRxF!NZfFIm$yZ7$6I6MgHS=`n>5_i#wc`xfMH02}F~jLmz{ zi))AM;0(%F`HK(Y8NzVl!UZAhyo55X>d(d>RJ)&jfRYhFv(;w~TL%#kx5qq2UuK~@ z@R?`OnN+#W=LPGL*|gIVnGMGr`N9V+SjUar<+(%m&zu;Vp(R;M>&45Eyq1gLHkF!~ z_3}HEwJzUlsdtv4OyMd(e%Yr)@3LCAmwS=^i9wQJP3*lJi?EkUu_`Qt4i?R|To%nn z6=XnhM9gT)3A13j1x68RA6PB-*$A3@o=E$}#5ut1W@?vCA1O=!$IfHUm1L+TaCEwnMT;-Bl)nDOJlES9VGNArTQg%2s&XJX|xV(uvFR&--j8I9xI39SatCfF_L~E z`1QgSVsw*5fR0D1nr1arf8vG>rVc{CeUHP#oaha)N*NI2W#}` zOYqXN->gkRYXEp4!1s~Y`;&H-uEXEQZZ{de%&$N`4Q>x=gXKe2{Anb%exXB9Kw1FJ2re= zlz)J{26x6f%xeqvRZIo?>&|?`XsX`$i%<7lfclkR&Fb}0fAvn5C~lRmDn)b-qps2h z09SO(A&Vv!QAgt+J86`5KpwhC6d1b$#&L=XxHh{YDVX4~Z=M7l z(FO7=Yb>el%OPm5qL~q#HQnq2n_yacP)#`yAn#qOsyVrJO>$T2xEDL+j#r1K$9#ou zb*x3s+*{sV@*LS#@_&^pp^tuj8Vu}QCz-)7GbgE^Yj(X?1%B>dvsvIPp)n>4oOYO#WUKsh$hk7La&qfrP{>}Rd>3Wn+rjmNy z)S901_f?r{EGwL4kv(7UxNTBn(lKwKrt@GZYlQ5lu5Ozw+YH6TQ4Ja}0K)RteNWX> zU|%$bUPqeJ3s9F&q$w4?WU(kNEjV`cO!4e&!0NwdLx~M{ycdm2_~EnRV862GlRl!B zO#8+3SP`6M_p0k3@A`N5?esjVr({YbH~BpB3<~&h>#7!YfseQY6nm3FewkZC3x^^;H z_8)vE(>wG}yhx8*r&LoG>K@P1a*|L?bk>RGXKbo_AmflXdE4o#YsYO>b#!osnOS&a zJROqrs}*y-ug1tbn5mAFSm=o3+lF=O>gPp=rZV3EMo_F_t_WB@WRstK+Zfr?Yv6n; z`Fh%_++>O^rsg@pQ!mUnsHcWm#gVgt)4ZFxGk{}Od0PeYIzq#UXa4hEXn}eKTB7xY z(Vh65Nyvm%fZAme(KHsIW>l-%eYx+z2>8a!kmS&u7UWA__qgJ+u5^8Pg`7(N>Y}UR z!>oG%{lVD%+SR>Rd+KeEME?}n9_-kh#w*0HP4A?SE$`8_O|_fM*twI>|X((ek~E5wE5FYXsY zZ-uMOQV&*kdA@WdxLr$mcg?mar!o!yOR1jZMsCEf)#kwpGo%Paf-3TRf1r56^s0{G z9|wkCQ>gS!3a<}nASt2V1A=b;cqyUp0P zT{=S2X0T#xeyo&kxbEu-nm+VvN=@~=v+>4zcjKbOrIRnqMEXT9vesXLGdE@n`v_e$ zQW3nNi~bF9BZ5AD3_`0#hxdTx<6&LV&g%qQPdT^5-f)(X;`Ql$eFfTI4GdQG!mZm< z=1YIb19u5mrtoQn%xgBFt?dkjmok2VIz>#;^_s&*K1s(KJm&dZhsVprIVf-Glkc)h zxjzbQs>^K~T&ay_XFw3zP+Q){U`qdpAS#72_rzr8V-~6Q4=p^@fRC8?(EB1}0=J`^ zs*;s7t(l^qqsXeV-Q6TJcFw;OClbnZYO;d> zS^fALpr+Cg7_DI7CRJJa1sttB@|Ak`s)0J+&(EZM=hYYIkdckx&2ia`Hmx&W-Q66W zO_pMGy1!-^KIH@k?3C<9a>P_pW$&f#b#TSM!QY?4#HBL~60#yW|CE_>aZ*UNO#*ta zL*7p;RAK!#24Jc8p^+Kd_sehl9E54!>!Y>fRAO(+R2={r-64e9YtQ5lKK_JiX~rec z1oM%1Gl5bMFBeK`!pKS_ZOMbQH+8`lKj<2pV2ET;jJdM zT@*7Dif+Loq08~S%m{4HI5v3M>DhtYOw-=+OX$`{DYkjXYSw)7$A|TLQMxbO_j!hS zwbav=<#vevSEcP8zQ@k*e>Th`%FvB9ckrvlO+d%d*ORGU9g0-2q;F&8XFKYq4J?zo z_K523fTwpHs3S`qf7@1lPJ1S4k0hetXNM?6SqOW%^sg>pF@>M;C(84NrX2g92CT)B7{+ zQ0)R2M;<3!4G`EA_q!^1cZ~h#JxZ-;B?9PEdA854SJu~z8N=K|_%cNo>kCEQ{{;UE zZGLfqVz^ryBZ5do-kLVR%wYu%U$Uf^ne02{(j43;;1r?6FctN=*= znm2bqXOC-XNC-!rg_CQPyYEty>J7ok=q^6s8Lg6pK@zShevu<{{Yc&D*-QX5uYtX+ zolZ%-p5qnbEYg6!uUR}^ndz)BqI%{|?uUy_q}Jldf|bS(ua(8sGGx zju8x3k7{ZVze9hSP+OPNj`AF##?~(g&$5>pPX4=Uus(6Kf+(L^{1xB_j2bH`?Ymk2qZh+~Rg`=c2_@ks!!3Y#%YRbe7eRP3C zwn#y!T}7Iiv-b=RI#b)a6^5YQSJ5W@V z4+K8ig}_R8$9|@V!0V~NZ7}wx7Ki4ws}uEdutYgx4)w(3D_XL%7hO-LUeccW=AKA3 zJER*AhB5k7O}9SC?4X|3h)?N1`0NRN=J%Zza&*M5)=%gJP;f86M^NIPQ+J1n`R1K@ zLvbNNjfyIv1uw5 zL=0wqaIEr$xH1yReLPFA#Iar1y_As3*?vdF&!Gj!B@^Uy`noaWsY3 z>nEy3)4u1`nR{@%v+%%7&h0;?eeXO567|(ns)^#QxDI79+vcaoq6v(9BVEPAk;M#T ziVsPxNEv-TZ`NsNRV}mIY`2{r^<&A%IGTXplC}Mj*!LwgqXREr%`>a(BDGhyp|?zq z)6UqnvsSa&=lw72tl@9EUzp9PdQ$sL$Pq~#+o*rXZNWtNPMU^c+)8Dl_|V#kd_qWu zlUfEoB5mjklj6OUqR4-S@-NI=tZs5N`TPltg6@%3nFz*G-{euvga{Une`WdyKu$Xk^E3 zWZEDz9ekO`h<`S!_5(D7h{tLWOJGPRgHP}%Jf}XPyHW%NntO+EVrqqDvh06sMIkKy z2r?_FKYuq$+|g1~l;&Hg!SX$Qi?E`p))+!+-pmE%2vL(ou%|)klMXo?;80SNntZ=6 zjRfa>M-PJ*$c`q5ypJZ9i$p`Fg3mz(fX*KVxj2Q!l!leemSeu-{`&@nDoB;!me=!< zW}Pqw3ft8I<$@0~tmeGt&yF@TN}?yYe>?i1D3F1~Jr_rkU!^?dIWm8AGK=9~-sOd> zEc&6TyK69gSBC7Ub7*)#Ic_zv;_$$WK(03IwV%z52D}JPmsu99Z=bmb9GlFn39m0v zvB1@C6r#!7KqTzB*yHiYW`aVrsDBDmf_atEkO|@sZ(X>3w09fBvb>{m$pBeXFv9DcnYB97t zjf+3pPm8Ihz3dFL~FpjPUz(h%1b8 zf6ohj*|Z$SRz>0eb|v+1yUc@5`gA^pt=#A-MDu_kWUg!|M=+{xw^kDDtnxyEBm||9 zN9s6T#2s@P-EiWb@tf%;{_5VqC;>D4kTik@bRZ}%YIFhwkoO6ZWABi9KX0by|AgA1 zbtmnQE`W#6T%z|+Q$~Zk$?Pa22jbM%^_{}cSej^#o>&HpM2&KRLEGt=CDg6stSz#$ z1NpWTHYbK$|b9KArON(q=(R-29p-kc4`Fo#wVb-n!0w|)A57|hz1?_0s$=vu0 z3+T-_Pvom^LngxFH$blZ8yD0)){g8sNMz_xQ=haZ%6^hy?DVs1`-3>g>|<7Gmk*Ne zwuzCC>`i7DznRZwMR10s9Yo`8Fp%ZlQp{RL5FNP{3mPFp>T|*GL)^I+oI9BocwERT zi`+e#mbUIYoKFouKZ}L*4SBtu_1|lw?kPO%y@rG}2uYg*qyUPCGVB?!>t@mDg7?!m zAqU?-V&&gQ=!+ja|7ng3qal{9P6a5n#6qyyHefX(q z)SlDMXxyi)o|wv|OFR!UElJZz=!(d_eHshgv8EGd86!xJh!Hg0Pd1U64{&6_ADziMLt0n5gTMvPbNCN>H&HNoRMWD#JZ9N)9v`5cpVW8R!S8#bF)t5QkjKE1 zHwyMd)?aqo&y;){<7mIp_WR58W) zb)4B8@>X{wshyK9_mGdgM*xZGiXqWB%22;`PpGg@v(slCC?DWT1xY-yh7{Kbf-mDC zu%cR2-UcPa(U-ct)>Oqpgli|GwHAr75t#Z-U9O)&rHZoNjP|HQ{noU0^uEg?9b4J_ zXydPFD4HiL(WDB<p1)ScKW8d=+<-sQ*oq{g3zD}l9lX^@ ze+0edkJ~$B!0KmjW5OQNSazRL9I=7v(a*cs?P894eKjeKxTtKpZ6V}Gt4z3@dqZ`4 z)vQFR*{?_v+uW0jx^+A0;bXevh( z+)flxbYryuXNU6o@*HWe#Y$@QD`rqlpk2$dwLF7DbdTpS=U|XDa%Rc`Dm5=*?;4ik zVor8+IaK(d6J`J97@Fsps2-VXx(*~xSMu>5RmYd2^geULHwVtnBvQ({vhF%1O2m(Z zKgwLaO8*IIKmHi%az=xyp-TTws$f50J6ibKgTaUC;C@2a7pOf-r9Z2dR~ue!_*=i5&C);KxVR-ToNR2tON(5eXsSXylQ&pb;s$J z@AT|}EP)CABONQh{A%#@N3o>Yjx+?W_LMd+6-|i8NJE3RsUD`Xa@?T|HWWga)C-5c zK8DxD_I$)1UZu*Sj6mc7LIwx?D>^_nt&bUlL+iC|tFx>Aj*tLV{{U~vS?ilGnrxlx zOK^O##E;M_!cswG_Fc*r3M zI*_&z)q+=}BJy4>VMPeS)T{!Aw&&97oyzu-`1rhBtxYlopv0T?*Y!&)&1&&5rI%eT zqBz#bOxm!u$+(Wg&x2UUH5F#U22vqKEvqYKDyGfHOH@Iy=DI7hCa$Lz%ETS!`jOE@ zg;|K)g?VW)vEbMjtf-LTT&A!i6Pi7>kWrVdpY!O%{k^X1a40YM6)c%H!ev7cV9wL% zbSCaa-uYw-{PcQX+vUoXzRa{_1nAy)0!G*(Z#kH3RV8C~uaL^st25^}L)T9bP2eAQ z)tgp=m)m{q1fssyB3JuOy(`YSmWf4sm+bG%!4hqBJN_BkAVA^ap|gv6$@?g;jag%k z!$kbdc-`=sBQ)h85nJD4{gyyKTWHK?WY_WyhOGup%-m0|KkaX2UVy!b7Ii7G;v*lw zn+wTlYR;Mlc_F!sEd~ez^2BdWiVsJ8NB^`9$(c#9gir5(*o)*hdhvFMC(obSkJU-N zRWmaaW&bVgN;fh3OWa6 z=AYVU(B2tsC}xM+bIiObaMPAky@p&z#eJXrz^u5r>Z*cAEjm@Do&L`k~^cbCbum!%b7bxje{;luhnMD(4&5a7lln zu_xUxIP~E>JeP(b+rzk4ZR@w1Ef{ud)|A`HVpeP7bT?nhxfu&h6fG20)NCGxL_729 zZqhLu^3Bn8V>FXH2)<)s)sJ=(b_{qgTny8?GQ9l6{jfhTbp6|OS-P#O!ByN3q&;7qt?_X#lzL49nvSx` zsKZCo_5qs1$K{;nKEnRdE*j&E4z7wpF8=_#BDLy9jNxDh^jZ2*yV@=KEybJ;h6D>C zy4UEB7zV-dHNrt>)G|?ir8b%$n0=G1cc$0i>oR!80v-#RF0AKViHYhnS)o?%IkA?I zHF+3u;`m|QblqFgIJm49z8k%FHLv#DOZ`Px98gTf+3+Vp@4fQuAEwq)3z%+lj9c1| z3@VTD-pSQ}-RI*Hf%Fj%f=glHp|kQ-iGrFI&+D*%L)M6H`RZ$Tu=Yvo%Fk%Md~WZ8 zcwWjU8@|e`jOF8p4%q8$-=Vl-?$EBp2UQFOUOzZFTo-4)#7cK))uw|3LM;X6@N< z6x2PrB~wZ_X}l3Kp(ubP4v95c)_W<8&Sxcf2cxLHQ^X>8e(mUgUVkOL;&xu1yZX(C zX|L#2>~DB>N3zS1`rG?e@g?@@9}@wRmhBf{kf}+DFcaqK^%X%9nT%GOvpbJ#Ia>uL zNHlvVlaTb;OZK*P>6rut-1g-y*%?ph>&5wupw9_catk`ng4m3Pf*@6l@julbs!@9B zhIiI;cPBEc9;tBB0Nopc-=^1elgN)<^;;KEWf4gD@mu+IRz7N}t9O#Zjsblx*jJgS z_edh*SNZj4iHzzYm)j{uvr~Q)@oEi2&JM|ZD{Xo!Ko%~MY(`NF(-}b)YDYBVqe0a{ z=hV=tLsMtNH)7g&AL#y%Xzae%?^}MbZO$0o>?ec2zssKRV*8@D7Pcw>OD5j5ge7MX zoH-g=jn0+!Z>hTg*~vyn5O9y@JEilQy$&krUl!T3bL++zhqM~UKPUuJ&@h3H!B~u= zNi;+u;A;HOcGfCDKXVF|aHXFGG+^antC;Ajvxy6rze9q_#y74EKWl=zS#Pa%mm+(* zpQAXxub&8mkESmk-O|q_afypCXnJhR++%M40MNLG#1t?en9Rjstr&YM>||rQU7WED z^VbN4@4uAyp2q*7s2>`XrJwVKp0DPdSX>ElJ((<3*NoxKYKE@Diu^uBw2o`EpZ?r11{=L!VC^@h>!P%OWJi_Go zBEWTom@vPePV?;o)FS=|>Qzg@jqx%)Ct+Tbv>;Ht(9JB`fr@`DUF5c&4of6DV`CwV zZBEKJ?@wAmpY5?gtM3iUE#c z_(ILh66_Ew)7Z&p`uRts49t1q>B%F7<4}VC?8!E0W@>q}6j7_v)E?xF_!c*?Yne(s zYejKxF&W5UhcCfRIY*rZe*EQ z7`t!qUuBQvW!6OcazbZZ2G zudNHq_;y}d%uXvjulcYuhg|FRvPxxJ6u&na@vAU6uUv=CX#AaucPmTK{Z)eF^O4js zrjYd0rW`}cSV_K`q1I&!W#>CPu)T}^6f-d&>tw!2 z=Kb|t{UJNPZ&JYiXUXDe#oDe)IuqQ(2fQ`M#z_3MHufy6MXEAH-@HhwT|)Gx%Dsxx zv_s9=Cg-K`IMnXXjE`Y)rRE#5duQb-&bZD)((O9sUX4nJ>5+MKHV2j=!5EHbQDm=K zopZm^?P4nE)7C?t;yv(py+EIkw+{5es7-SCJOGvRe-R80cPJr}#lP;bLN%V!UQ8|5 zqs;H_?iF5P0Gfs)IUwORZ84JdqlRv3NQNr9P^ksgomc&)q#oI^c@xdGPlI)xZdWm4 zC$^T0Hr`JRUfilNum>6$$BsFxIfy8KdxvfZXU=qwz#3 zSKS}RviGhfLxTH8gPf6L*i|FhBRlATpO}$jpfdRM`nM<{<7ErRKt$c7-ni&Q6;l;h z3ei;&9z{Fa=8Szi;=}J#OEC_y~4H(>7>mQns(g zYBuy)lmI5I+N-db70(FKB?@;HE*2chC;#8RY&o8$z()>z{hv_@ia=n2^`Fp`Ah`c& z77DM*yp}AjsD${n`Lvg_?|CfbpjU&YRbUsf$wCMlB;CLK13B6mI9N9A7k%LzD7)7u zr1D@cWJOEzmeWMV?WE^jI@mVg^@-wWAGJCSsjH9Uj_Q@i?4e&%9#0O=3Vrf_553f`fger&UPv)o)1y&}(bG?KUPv*jEO9%+wM4YA3TEYnO9Tye2q zIsVgGPW^prQD0CyIxn*rMU1qU&Ntl=iXMMkT%eYC)adARa(db5_BL^C diff --git a/docs/images/nanoseq_subwaymap_v3.0.svg b/docs/images/nanoseq_subwaymap_v3.0.svg index db41c9fc..f6941f37 100644 --- a/docs/images/nanoseq_subwaymap_v3.0.svg +++ b/docs/images/nanoseq_subwaymap_v3.0.svg @@ -28,8 +28,8 @@ inkscape:document-units="mm" showgrid="false" inkscape:zoom="0.51669611" - inkscape:cx="796.40623" - inkscape:cy="663.83314" + inkscape:cx="668.67157" + inkscape:cy="907.69021" inkscape:window-width="1440" inkscape:window-height="784" inkscape:window-x="0" @@ -273,19 +273,19 @@ style="font-size:18px;stroke-width:0.999998" x="131.17209" y="759.29279" - id="tspan3275-4">direct RNA (align to transcriptome)direct RNA + cDNA (align to genome)direct RNA + cDNA (align to genome)direct RNA (align to transcriptome) Date: Thu, 19 May 2022 15:52:22 +0200 Subject: [PATCH 154/169] Fix subway map 2 --- docs/images/nanoseq_subwaymap_v3.0.png | Bin 146213 -> 146739 bytes docs/images/nanoseq_subwaymap_v3.0.svg | 22 ++++++++-------------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/docs/images/nanoseq_subwaymap_v3.0.png b/docs/images/nanoseq_subwaymap_v3.0.png index 90496d5821c09e74592a68ae4f5cbb9af59103f7..9bd085fae6246479992c0da3388ae56bd2c1ca23 100644 GIT binary patch literal 146739 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
  • $_$FnRLr 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 z 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
    ;}B-WB%SrQ?iJ<$uW$LX5wT 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%0A8)fak1DT8iz*A$avx1 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 b01Wm6wr*`}=0ceP00000NkvXXu0mjf)U^!L literal 146213 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

    *Fa;0YwI_VXaB}>c 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 Date: Mon, 23 May 2022 14:25:41 +0800 Subject: [PATCH 155/169] samtools 1.15.1 kinda works --- modules/local/samtools_flagstat.nf | 26 ---------------------- modules/local/samtools_idxstats.nf | 26 ---------------------- modules/local/samtools_index.nf | 28 ------------------------ modules/local/samtools_sort.nf | 4 ++-- modules/local/samtools_sort_index.nf | 4 ++-- modules/local/samtools_stats.nf | 4 ++-- modules/local/samtools_view_bam.nf | 4 ++-- subworkflows/local/bam_stats_samtools.nf | 1 + 8 files changed, 9 insertions(+), 88 deletions(-) delete mode 100644 modules/local/samtools_flagstat.nf delete mode 100644 modules/local/samtools_idxstats.nf delete mode 100644 modules/local/samtools_index.nf diff --git a/modules/local/samtools_flagstat.nf b/modules/local/samtools_flagstat.nf deleted file mode 100644 index 03721d0b..00000000 --- a/modules/local/samtools_flagstat.nf +++ /dev/null @@ -1,26 +0,0 @@ -process SAMTOOLS_FLAGSTAT { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" - - input: - tuple val(meta), path(bam), path(bai) - - output: - tuple val(meta), path("*.flagstat"), emit: flagstat - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - """ - samtools flagstat --threads ${task.cpus-1} $bam > ${bam}.flagstat - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/samtools_idxstats.nf b/modules/local/samtools_idxstats.nf deleted file mode 100644 index cd068679..00000000 --- a/modules/local/samtools_idxstats.nf +++ /dev/null @@ -1,26 +0,0 @@ -process SAMTOOLS_IDXSTATS { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" - - input: - tuple val(meta), path(bam), path(bai) - - output: - tuple val(meta), path("*.idxstats"), emit: idxstats - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - """ - samtools idxstats $bam > ${bam}.idxstats - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/samtools_index.nf b/modules/local/samtools_index.nf deleted file mode 100644 index 5ef71375..00000000 --- a/modules/local/samtools_index.nf +++ /dev/null @@ -1,28 +0,0 @@ -process SAMTOOLS_INDEX { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" - - input: - tuple val(meta), path(input) - - output: - tuple val(meta), path("*.bai") , optional:true, emit: bai - tuple val(meta), path("*.csi") , optional:true, emit: csi - tuple val(meta), path("*.crai"), optional:true, emit: crai - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - """ - samtools index -@ ${task.cpus-1} $args $input - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/samtools_sort.nf b/modules/local/samtools_sort.nf index 6465e000..f911fde9 100644 --- a/modules/local/samtools_sort.nf +++ b/modules/local/samtools_sort.nf @@ -4,8 +4,8 @@ process SAMTOOLS_SORT { conda (params.enable_conda ? "bioconda::samtools=1.14" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam) diff --git a/modules/local/samtools_sort_index.nf b/modules/local/samtools_sort_index.nf index 7cc050a0..127656ad 100644 --- a/modules/local/samtools_sort_index.nf +++ b/modules/local/samtools_sort_index.nf @@ -4,8 +4,8 @@ process SAMTOOLS_SORT_INDEX { conda (params.enable_conda ? "bioconda::samtools=1.14" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(bam) diff --git a/modules/local/samtools_stats.nf b/modules/local/samtools_stats.nf index 229f1b6a..b5e45e2a 100644 --- a/modules/local/samtools_stats.nf +++ b/modules/local/samtools_stats.nf @@ -4,8 +4,8 @@ process SAMTOOLS_STATS { conda (params.enable_conda ? "bioconda::samtools=1.14" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(input), path(input_index) diff --git a/modules/local/samtools_view_bam.nf b/modules/local/samtools_view_bam.nf index 791b0143..d95fa2bc 100644 --- a/modules/local/samtools_view_bam.nf +++ b/modules/local/samtools_view_bam.nf @@ -4,8 +4,8 @@ process SAMTOOLS_VIEW_BAM { conda (params.enable_conda ? "bioconda::samtools=1.10" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.14--hb421002_0' : - 'quay.io/biocontainers/samtools:1.14--hb421002_0' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(sizes), val(is_transcripts), path(sam) diff --git a/subworkflows/local/bam_stats_samtools.nf b/subworkflows/local/bam_stats_samtools.nf index b9034c2c..518f982e 100644 --- a/subworkflows/local/bam_stats_samtools.nf +++ b/subworkflows/local/bam_stats_samtools.nf @@ -3,6 +3,7 @@ */ include { SAMTOOLS_STATS } from '../../modules/local/samtools_stats' +//include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' From 1294c346b271129415e568e0a103872940d802be Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 23 May 2022 16:07:06 +0800 Subject: [PATCH 156/169] nf-core modules: samtools faidx and stats --- .../modules/samtools/faidx/main.nf} | 18 ++++++-- .../nf-core/modules/samtools/faidx/meta.yml | 44 +++++++++++++++++++ .../nf-core/modules/samtools/stats/main.nf | 2 - subworkflows/local/bam_sort_index_samtools.nf | 8 ++-- subworkflows/local/prepare_genome.nf | 2 +- .../{local => nf-core}/bam_stats_samtools.nf | 9 ++-- workflows/nanoseq.nf | 2 +- 7 files changed, 72 insertions(+), 13 deletions(-) rename modules/{local/samtools_faidx.nf => nf-core/modules/samtools/faidx/main.nf} (66%) create mode 100644 modules/nf-core/modules/samtools/faidx/meta.yml rename subworkflows/{local => nf-core}/bam_stats_samtools.nf (80%) diff --git a/modules/local/samtools_faidx.nf b/modules/nf-core/modules/samtools/faidx/main.nf similarity index 66% rename from modules/local/samtools_faidx.nf rename to modules/nf-core/modules/samtools/faidx/main.nf index a10db745..d0c68d5f 100644 --- a/modules/local/samtools_faidx.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -2,10 +2,10 @@ process SAMTOOLS_FAIDX { tag "$fasta" label 'process_low' - conda (params.enable_conda ? "bioconda::samtools=1.15" : null) + conda (params.enable_conda ? "bioconda::samtools=1.15.1" : null) container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15--h1170115_1' : - 'quay.io/biocontainers/samtools:1.15--h1170115_1' }" + 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : + 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" input: tuple val(meta), path(fasta) @@ -23,9 +23,21 @@ process SAMTOOLS_FAIDX { samtools \\ faidx \\ $fasta + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') + END_VERSIONS + """ + + stub: + """ + touch ${fasta}.fai cat <<-END_VERSIONS > versions.yml + "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') END_VERSIONS """ } + diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml new file mode 100644 index 00000000..6a3bb11b --- /dev/null +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -0,0 +1,44 @@ +name: samtools_faidx +description: Index FASTA file +keywords: + - index + - fasta +tools: + - samtools: + description: | + SAMtools is a set of utilities for interacting with and post-processing + short DNA sequence read alignments in the SAM, BAM and CRAM formats, written by Heng Li. + These files are generated as output by short read aligners like BWA. + homepage: http://www.htslib.org/ + documentation: http://www.htslib.org/doc/samtools.html + doi: 10.1093/bioinformatics/btp352 + licence: ["MIT"] +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fasta: + type: file + description: FASTA file + pattern: "*.{fa,fasta}" +output: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] + - fai: + type: file + description: FASTA index file + pattern: "*.{fai}" + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" +authors: + - "@drpatelh" + - "@ewels" + - "@phue" + diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index bbdc3240..72b7e2bc 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -28,7 +28,6 @@ process SAMTOOLS_STATS { ${reference} \\ ${input} \\ > ${input}.stats - cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') @@ -39,7 +38,6 @@ process SAMTOOLS_STATS { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${input}.stats - cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index d49020a7..218a587d 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -4,14 +4,16 @@ include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' include { SAMTOOLS_SORT } from '../../modules/local/samtools_sort' +//include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' include { SAMTOOLS_SORT_INDEX } from '../../modules/local/samtools_sort_index' -include { BAM_STATS_SAMTOOLS } from '../../subworkflows/local/bam_stats_samtools' +include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' workflow BAM_SORT_INDEX_SAMTOOLS { take: ch_sam // channel: [ val(meta), [ bam ] ] call_variants + ch_fasta main: /* @@ -24,7 +26,7 @@ workflow BAM_SORT_INDEX_SAMTOOLS { .join( SAMTOOLS_SORT_INDEX.out.bam_bai ) .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } .set { sortbam } - BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT_INDEX.out.bam_bai ) + BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT_INDEX.out.bam_bai, ch_fasta ) } else { SAMTOOLS_SORT ( SAMTOOLS_VIEW_BAM.out.bam ) SAMTOOLS_INDEX ( SAMTOOLS_SORT.out.bam ) @@ -33,7 +35,7 @@ workflow BAM_SORT_INDEX_SAMTOOLS { .join( SAMTOOLS_INDEX.out.bai ) .map { it -> [ it[0], it[1], it[2], it[4], it[5] ] } .set { sortbam } - BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]) ) + BAM_STATS_SAMTOOLS ( SAMTOOLS_SORT.out.bam.join(SAMTOOLS_INDEX.out.bai, by: [0]), ch_fasta ) } /* diff --git a/subworkflows/local/prepare_genome.nf b/subworkflows/local/prepare_genome.nf index a88ab3ec..04a8b1e7 100644 --- a/subworkflows/local/prepare_genome.nf +++ b/subworkflows/local/prepare_genome.nf @@ -4,7 +4,7 @@ include { GET_CHROM_SIZES } from '../../modules/local/get_chrom_sizes' include { GTF2BED } from '../../modules/local/gtf2bed' -include { SAMTOOLS_FAIDX } from '../../modules/local/samtools_faidx' +include { SAMTOOLS_FAIDX } from '../../modules/nf-core/modules/samtools/faidx/main' workflow PREPARE_GENOME { take: diff --git a/subworkflows/local/bam_stats_samtools.nf b/subworkflows/nf-core/bam_stats_samtools.nf similarity index 80% rename from subworkflows/local/bam_stats_samtools.nf rename to subworkflows/nf-core/bam_stats_samtools.nf index 518f982e..04e443ad 100644 --- a/subworkflows/local/bam_stats_samtools.nf +++ b/subworkflows/nf-core/bam_stats_samtools.nf @@ -2,20 +2,23 @@ * Run SAMtools stats, flagstat and idxstats */ -include { SAMTOOLS_STATS } from '../../modules/local/samtools_stats' -//include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' +include { SAMTOOLS_STATS } from '../../modules/nf-core/modules/samtools/stats/main' include { SAMTOOLS_IDXSTATS } from '../../modules/nf-core/modules/samtools/idxstats/main' include { SAMTOOLS_FLAGSTAT } from '../../modules/nf-core/modules/samtools/flagstat/main' workflow BAM_STATS_SAMTOOLS { take: ch_bam_bai // channel: [ val(meta), [ bam ], [bai] ] + ch_id_fasta main: /* * Stats with samtools */ - SAMTOOLS_STATS ( ch_bam_bai ) + ch_id_fasta + .map{ it -> it[1] } + .set{ ch_fasta } + SAMTOOLS_STATS ( ch_bam_bai, ch_fasta ) /* * Flagstat with samtools diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 45c280d2..02ab37e9 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -357,7 +357,7 @@ workflow NANOSEQ{ /* * SUBWORKFLOW: View, then sort, and index bam files */ - BAM_SORT_INDEX_SAMTOOLS ( ch_align_sam, params.call_variants ) + BAM_SORT_INDEX_SAMTOOLS ( ch_align_sam, params.call_variants, ch_fasta ) ch_view_sortbam = BAM_SORT_INDEX_SAMTOOLS.out.sortbam ch_software_versions = ch_software_versions.mix(BAM_SORT_INDEX_SAMTOOLS.out.samtools_versions.first().ifEmpty(null)) ch_samtools_multiqc = BAM_SORT_INDEX_SAMTOOLS.out.sortbam_stats_multiqc.ifEmpty([]) From 7de0d1d4d9dfebd2e42aa3f65df873e9329847f7 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 23 May 2022 17:55:27 +0800 Subject: [PATCH 157/169] use samtools sort from nf-core modules --- conf/modules.config | 2 ++ modules.json | 3 ++ modules/local/samtools_sort.nf | 27 ------------------ modules/local/samtools_stats.nf | 28 ------------------- .../nf-core/modules/samtools/faidx/meta.yml | 1 - subworkflows/local/bam_sort_index_samtools.nf | 3 +- 6 files changed, 6 insertions(+), 58 deletions(-) delete mode 100644 modules/local/samtools_sort.nf delete mode 100644 modules/local/samtools_stats.nf diff --git a/conf/modules.config b/conf/modules.config index 5d8f818a..fd272ba4 100644 --- a/conf/modules.config +++ b/conf/modules.config @@ -200,6 +200,7 @@ if (!params.skip_alignment) { ] } withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/graphmap2" }, mode: 'copy', @@ -325,6 +326,7 @@ if (!params.skip_alignment) { ] } withName: SAMTOOLS_SORT { + ext.prefix = { "${meta.id}.sorted" } publishDir = [ path: { "${params.outdir}/minimap2" }, mode: 'copy', diff --git a/modules.json b/modules.json index 880ef889..fba548fb 100644 --- a/modules.json +++ b/modules.json @@ -15,6 +15,9 @@ "pycoqc": { "git_sha": "e745e167c1020928ef20ea1397b6b4d230681b4d" }, + "samtools/faidx": { + "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" + }, "samtools/flagstat": { "git_sha": "897c33d5da084b61109500ee44c01da2d3e4e773" }, diff --git a/modules/local/samtools_sort.nf b/modules/local/samtools_sort.nf deleted file mode 100644 index f911fde9..00000000 --- a/modules/local/samtools_sort.nf +++ /dev/null @@ -1,27 +0,0 @@ -process SAMTOOLS_SORT { - tag "$meta.id" - label 'process_medium' - - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" - - input: - tuple val(meta), path(bam) - - output: - tuple val(meta), path("*.bam"), emit: bam - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - def prefix = task.ext.prefix ?: "${meta.id}" - """ - samtools sort $args -@ $task.cpus -o ${prefix}.sorted.bam -T $prefix $bam - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/local/samtools_stats.nf b/modules/local/samtools_stats.nf deleted file mode 100644 index b5e45e2a..00000000 --- a/modules/local/samtools_stats.nf +++ /dev/null @@ -1,28 +0,0 @@ -process SAMTOOLS_STATS { - tag "$meta.id" - label 'process_low' - - conda (params.enable_conda ? "bioconda::samtools=1.14" : null) - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'https://depot.galaxyproject.org/singularity/samtools:1.15.1--h1170115_0' : - 'quay.io/biocontainers/samtools:1.15.1--h1170115_0' }" - - input: - tuple val(meta), path(input), path(input_index) - //path fasta - - output: - tuple val(meta), path("*.stats"), emit: stats - path "versions.yml" , emit: versions - - script: - def args = task.ext.args ?: '' - //def reference = fasta ? "--reference ${fasta}" : "" - """ - samtools stats --threads ${task.cpus-1} ${input} > ${input}.stats - cat <<-END_VERSIONS > versions.yml - "${task.process}": - samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') - END_VERSIONS - """ -} diff --git a/modules/nf-core/modules/samtools/faidx/meta.yml b/modules/nf-core/modules/samtools/faidx/meta.yml index 6a3bb11b..e9767764 100644 --- a/modules/nf-core/modules/samtools/faidx/meta.yml +++ b/modules/nf-core/modules/samtools/faidx/meta.yml @@ -41,4 +41,3 @@ authors: - "@drpatelh" - "@ewels" - "@phue" - diff --git a/subworkflows/local/bam_sort_index_samtools.nf b/subworkflows/local/bam_sort_index_samtools.nf index 218a587d..635f33c1 100644 --- a/subworkflows/local/bam_sort_index_samtools.nf +++ b/subworkflows/local/bam_sort_index_samtools.nf @@ -3,8 +3,7 @@ */ include { SAMTOOLS_VIEW_BAM } from '../../modules/local/samtools_view_bam' -include { SAMTOOLS_SORT } from '../../modules/local/samtools_sort' -//include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' +include { SAMTOOLS_SORT } from '../../modules/nf-core/modules/samtools/sort/main' include { SAMTOOLS_INDEX } from '../../modules/nf-core/modules/samtools/index/main' include { SAMTOOLS_SORT_INDEX } from '../../modules/local/samtools_sort_index' include { BAM_STATS_SAMTOOLS } from '../../subworkflows/nf-core/bam_stats_samtools' From 532807653cd415ac9912212b7edb22a3c4520bdd Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Mon, 23 May 2022 18:03:44 +0800 Subject: [PATCH 158/169] mv samtools/faidx and stats from nf-core/modules --- modules/nf-core/modules/samtools/faidx/main.nf | 1 - modules/nf-core/modules/samtools/stats/main.nf | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/modules/nf-core/modules/samtools/faidx/main.nf b/modules/nf-core/modules/samtools/faidx/main.nf index d0c68d5f..fdce7d9b 100644 --- a/modules/nf-core/modules/samtools/faidx/main.nf +++ b/modules/nf-core/modules/samtools/faidx/main.nf @@ -40,4 +40,3 @@ process SAMTOOLS_FAIDX { END_VERSIONS """ } - diff --git a/modules/nf-core/modules/samtools/stats/main.nf b/modules/nf-core/modules/samtools/stats/main.nf index 72b7e2bc..bbdc3240 100644 --- a/modules/nf-core/modules/samtools/stats/main.nf +++ b/modules/nf-core/modules/samtools/stats/main.nf @@ -28,6 +28,7 @@ process SAMTOOLS_STATS { ${reference} \\ ${input} \\ > ${input}.stats + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') @@ -38,6 +39,7 @@ process SAMTOOLS_STATS { def prefix = task.ext.prefix ?: "${meta.id}" """ touch ${input}.stats + cat <<-END_VERSIONS > versions.yml "${task.process}": samtools: \$(echo \$(samtools --version 2>&1) | sed 's/^.*samtools //; s/Using.*\$//') From 9142ce5e5f083f02194a5bb73a59e62a93ec2997 Mon Sep 17 00:00:00 2001 From: Christopher Hakkaart Date: Wed, 25 May 2022 13:12:44 +0200 Subject: [PATCH 159/169] Added gpu option for pepper_margin_deepvariant --- CHANGELOG.md | 30 ++++++++++++---------- conf/base.config | 2 +- modules/local/pepper_margin_deepvariant.nf | 10 +++++--- nextflow.config | 3 +-- nextflow_schema.json | 5 ++++ 5 files changed, 30 insertions(+), 20 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6be07748..102874ae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -25,6 +25,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Added `--call_variants` to detect DNA variants - Added `--split_mnps` to split multi-nucleotide polymorphisms into single nucleotide polymorphisms when using medaka - Added `--phase_vcf` to output a phased vcf when using medaka +- Added `--deepvariant_gpu` to use gpu with docker pepper_margin_deepvariant - Added `--skip_vc` to skip `variant_calling` - Added `--skip_sv` to skip `structural_variant_calling` - Added `--variant_caller` to specify variant caller. @@ -37,20 +38,21 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Software dependencies -| Dependency | Old version | New version | -| --------------------------- | ----------- | ----------- | -| `bioconductor-bambu` | 1.0.2 | 2.0.0 | -| `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | -| `cutesv` | | 1.0.12 | -| `deepvariant` | | 1.0.3 | -| `jaffa` | | 2.0 | -| `m6anet` | | 1.0 | -| `medaka` | | 1.4.4 | -| `multiqc` | 1.10.1 | 1.11 | -| `ont_fast5_api` | | 4.0.0 | -| `pepper_margin_deepvariant` | | 0.8 | -| `sniffles` | | 1.0.12 | -| `xpore` | | 2.1 | +| Dependency | Old version | New version | +| ------------------------------- | ----------- | ----------- | +| `bioconductor-bambu` | 1.0.2 | 2.0.0 | +| `bioconductor-bsgenome` | 1.58.0 | 1.62.0 | +| `cutesv` | | 1.0.12 | +| `deepvariant` | | 1.0.3 | +| `jaffa` | | 2.0 | +| `m6anet` | | 1.0 | +| `medaka` | | 1.4.4 | +| `multiqc` | 1.10.1 | 1.11 | +| `ont_fast5_api` | | 4.0.0 | +| `pepper_margin_deepvariant` | | 0.8 | +| `pepper_margin_deepvariant_gpu` | | 0.8 | +| `sniffles` | | 1.0.12 | +| `xpore` | | 2.1 | ### Bug fix diff --git a/conf/base.config b/conf/base.config index f71c8f65..ef052551 100644 --- a/conf/base.config +++ b/conf/base.config @@ -9,7 +9,7 @@ */ // Use this flag if using GPUs with Singularity -if (params.guppy_gpu) { +if (params.guppy_gpu || params.deepvariant_gpu) { docker.runOptions = '--gpus all' singularity.runOptions = '--nv' } diff --git a/modules/local/pepper_margin_deepvariant.nf b/modules/local/pepper_margin_deepvariant.nf index 4bac464e..29188c66 100644 --- a/modules/local/pepper_margin_deepvariant.nf +++ b/modules/local/pepper_margin_deepvariant.nf @@ -2,9 +2,11 @@ process PEPPER_MARGIN_DEEPVARIANT { tag "$meta.id" label 'process_high' - container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? - 'docker.io/kishwars/pepper_deepvariant:r0.8' : - 'docker.io/kishwars/pepper_deepvariant:r0.8' }" + if (params.deepvariant_gpu) { + container 'docker.io/kishwars/pepper_deepvariant:r0.8-gpu' + } else { + container 'docker.io/kishwars/pepper_deepvariant:r0.8' + } input: tuple val(meta), path(sizes), val(is_transcripts), path(input), path(index) @@ -21,6 +23,7 @@ process PEPPER_MARGIN_DEEPVARIANT { script: def args = task.ext.args ?: "" + def gpu = params.deepvariant_gpu ? "-g" : "" prefix = task.ext.prefix ?: "${meta.id}" //def regions = intervals ? "--regions ${intervals}" : "" //def gvcf = params.make_gvcf ? "--gvcf" : "" @@ -34,6 +37,7 @@ process PEPPER_MARGIN_DEEPVARIANT { -o "." \\ -p "${prefix}" \\ -t ${task.cpus} \\ + $gpu \\ $args cat <<-END_VERSIONS > versions.yml diff --git a/nextflow.config b/nextflow.config index cea1da63..60670ddd 100644 --- a/nextflow.config +++ b/nextflow.config @@ -47,12 +47,11 @@ params { call_variants = false variant_caller = 'medaka' structural_variant_caller = 'sniffles' - //no_intervals = false split_mnps = false phase_vcf = false skip_vc = false skip_sv = false - //keepgvcf = false + deepvariant_gpu = false // Options: Visualisation skip_bigbed = false diff --git a/nextflow_schema.json b/nextflow_schema.json index add4cec5..9d408c8f 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -228,6 +228,11 @@ "description": "Specifies if MNPs will be split into SNPs when using medaka.", "fa_icon": "fas fa-file-alt" }, + "deepvariant_gpu": { + "type": "boolean", + "fa_icon": "fas fa-exchange-alt", + "description": "Specifies whether to call variants with pepper_margin_deepvariant in GPU mode.." + }, "phase_vcf": { "type": "boolean", "fa_icon": "fas fa-exchange-alt", From 39021a769184e7914899372579bebf269b8a1a4a Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Mon, 6 Jun 2022 10:58:53 +0800 Subject: [PATCH 160/169] Update nextflow_schema.json Co-authored-by: Chris Hakkaart --- nextflow_schema.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nextflow_schema.json b/nextflow_schema.json index 9d408c8f..c82a5fa8 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -231,7 +231,7 @@ "deepvariant_gpu": { "type": "boolean", "fa_icon": "fas fa-exchange-alt", - "description": "Specifies whether to call variants with pepper_margin_deepvariant in GPU mode.." + "description": "Specifies whether to call variants with pepper_margin_deepvariant in GPU mode." }, "phase_vcf": { "type": "boolean", From 871d2980d43eef408ec732f4b678df9502d7c827 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Mon, 6 Jun 2022 11:00:23 +0800 Subject: [PATCH 161/169] update --- CHANGELOG.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 102874ae..51a10b47 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). -## [3.0.0] - 2022-05-10 +## [3.0.0] - 2022-06-21 ### Major enhancements @@ -51,6 +51,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 | `ont_fast5_api` | | 4.0.0 | | `pepper_margin_deepvariant` | | 0.8 | | `pepper_margin_deepvariant_gpu` | | 0.8 | +| `samtools` | 1.14 | 1.15 | | `sniffles` | | 1.0.12 | | `xpore` | | 2.1 | From db03f4ee5cf797924c65632d08eac4849e3d163b Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan Date: Thu, 9 Jun 2022 10:08:19 +0800 Subject: [PATCH 162/169] address suggestions from Maxime --- CHANGELOG.md | 2 +- CITATIONS.md | 18 +++++------------- README.md | 2 +- nextflow.config | 9 +-------- 4 files changed, 8 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 51a10b47..be995280 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - Add `demux_fast5` module to output demultiplexed fast5 files when `--output_demultiplex_fast5` is set - Add `--trim_barcodes` in Guppy basecaller to trim the barcodes from output fastq - Port pipeline to the updated Nextflow DSL2 syntax adopted on nf-core/modules - - Removed `--publish_dir_mode` as it is no longer required for the new syntax +- Removed `--publish_dir_mode` as it is no longer required for the new syntax - Bump minimum Nextflow version from 21.04.0 -> 21.10.3 - Update pipeline template to nf-core/tools `2.2` - Update `bambu` version from `1.0.2` to `2.0.0` diff --git a/CITATIONS.md b/CITATIONS.md index 69a74533..b60833a1 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -12,20 +12,16 @@ - [BEDTools](https://www.ncbi.nlm.nih.gov/pubmed/20110278/) -* [cuteSV](https://pubmed.ncbi.nlm.nih.gov/32746918/) + > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. + +- [cuteSV](https://pubmed.ncbi.nlm.nih.gov/32746918/) > Jiang T, Liu Y, Jiang Y, Li J, Gao Y, Cui Z, Liu Y, Liu B, Wang Y. Long-read-based human genomic structural variation detection with cuteSV. Genome Biol. 2020 Aug 3;21(1):189. doi: 10.1186/s13059-020-02107-y. PMID: 32746918; PMCID: PMC7477834. -* [DeepVariant](https://pubmed.ncbi.nlm.nih.gov/30247488/) +- [DeepVariant](https://pubmed.ncbi.nlm.nih.gov/30247488/) > Poplin R, Chang PC, Alexander D, Schwartz S, Colthurst T, Ku A, Newburger D, Dijamco J, Nguyen N, Afshar PT, Gross SS, Dorfman L, McLean CY, DePristo MA. A universal SNP and small-indel variant caller using deep neural networks. Nat Biotechnol. 2018 Nov;36(10):983-987. doi: 10.1038/nbt.4235. Epub 2018 Sep 24. PMID: 30247488. -* [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - - > Quinlan AR, Hall IM. BEDTools: a flexible suite of utilities for comparing genomic features. Bioinformatics. 2010 Mar 15;26(6):841-2. doi: 10.1093/bioinformatics/btq033. Epub 2010 Jan 28. PubMed PMID: 20110278; PubMed Central PMCID: PMC2832824. - -- [FastQC](https://www.bioinformatics.babraham.ac.uk/projects/fastqc/) - - [featureCounts](https://www.ncbi.nlm.nih.gov/pubmed/24227677/) > Liao Y, Smyth GK, Shi W. featureCounts: an efficient general purpose program for assigning sequence reads to genomic features. Bioinformatics. 2014 Apr 1;30(7):923-30. doi: 10.1093/bioinformatics/btt656. Epub 2013 Nov 13. PubMed PMID: 24227677. @@ -44,14 +40,10 @@ > Hendra C, et al., Detection of m6A from direct RNA sequencing using a Multiple Instance Learning framework. bioRXiv (2021) -* [PEPPER-Margin-DeepVariant](https://pubmed.ncbi.nlm.nih.gov/34725481/) +- [PEPPER-Margin-DeepVariant](https://pubmed.ncbi.nlm.nih.gov/34725481/) > Shafin K, Pesout T, Chang PC, Nattestad M, Kolesnikov A, Goel S, Baid G, Kolmogorov M, Eizenga JM, Miga KH, Carnevali P, Jain M, Carroll A, Paten B. Haplotype-aware variant calling with PEPPER-Margin-DeepVariant enables high accuracy in nanopore long-reads. Nat Methods. 2021 Nov;18(11):1322-1332. doi: 10.1038/s41592-021-01299-w. Epub 2021 Nov 1. PMID: 34725481; PMCID: PMC8571015. -* [pycoQC](https://doi.org/10.21105/joss.01236) - - > Leger A, Leonardi T, (2019). pycoQC, interactive quality control for Oxford Nanopore Sequencing. Journal of Open Source Software, 4(34), 1236. - - [Minimap2](https://pubmed.ncbi.nlm.nih.gov/29750242/) > Li H. Minimap2: pairwise alignment for nucleotide sequences. Bioinformatics. 2018 Sep 15;34(18):3094-3100. doi: 10.1093/bioinformatics/bty191. PMID: 29750242; PMCID: PMC6137996. diff --git a/README.md b/README.md index eb4cc213..5621286c 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,7 @@ An example input samplesheet for performing both basecalling and demultiplexing nf-core/nanoseq was originally written by [Chelsea Sawyer](https://github.com/csawye01) and [Harshil Patel](https://github.com/drpatelh) from [The Bioinformatics & Biostatistics Group](https://www.crick.ac.uk/research/science-technology-platforms/bioinformatics-and-biostatistics/) for use at [The Francis Crick Institute](https://www.crick.ac.uk/), London. Other primary contributors include [Laura Wratten](https://github.com/lwratten), [Ying Chen](https://github.com/cying111), [Yuk Kei Wan](https://github.com/yuukiiwa) and [Jonathan Goeke](https://github.com/jonathangoeke) from the [Genome Institute of Singapore](https://www.a-star.edu.sg/gis), [Christopher Hakkaart](https://github.com/christopher-hakkaart) from [Institute of Medical Genetics and Applied Genomics](https://www.medizin.uni-tuebingen.de/de/das-klinikum/einrichtungen/institute/medizinische-genetik-und-angewandte-genomik), Germany, and [Johannes Alneberg](https://github.com/alneberg) and [Franziska Bonath](https://github.com/FranBonath) from [SciLifeLab](https://www.scilifelab.se/), Sweden. -Many thanks to others who have helped out along the way too, including (but not limited to): [@crickbabs](https://github.com/crickbabs), [@AnnaSyme](https://github.com/AnnaSyme),[@ekushele](https://github.com/ekushele). +Many thanks to others who have helped out along the way too, including (but not limited to): [@crickbabs](https://github.com/crickbabs), [@AnnaSyme](https://github.com/AnnaSyme), [@ekushele](https://github.com/ekushele). ## Contributions and Support diff --git a/nextflow.config b/nextflow.config index 60670ddd..05fa4871 100644 --- a/nextflow.config +++ b/nextflow.config @@ -195,13 +195,6 @@ if (!params.igenomes_ignore) { params.genomes = [:] } -// Load igenomes.config if required -if (!params.igenomes_ignore) { - includeConfig 'conf/igenomes.config' -} else { - params.genomes = [:] -} - // Export these variables to prevent local Python/R libraries from conflicting with those in the container // The JULIA depot path has been adjusted to a fixed path `/usr/local/share/julia` that needs to be used for packages in the container. // See https://apeltzer.github.io/post/03-julia-lang-nextflow/ for details on that. Once we have a common agreement on where to keep Julia packages, this is adjustable. @@ -241,7 +234,7 @@ manifest { description = 'A pipeline to demultiplex, QC and map Nanopore data' mainScript = 'main.nf' nextflowVersion = '!>=21.10.3' - version = '2.0.1' + version = '3.0.0' } // Load modules.config for DSL2 module specific options From e5309a3a9ed28f237aed8b3430d5f6a5c68d2897 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Fri, 10 Jun 2022 09:58:09 +0800 Subject: [PATCH 163/169] update zenodo citation pointed out by Maxime --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5621286c..3cd6f83b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![GitHub Actions CI Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20CI/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+CI%22) [![GitHub Actions Linting Status](https://github.com/nf-core/nanoseq/workflows/nf-core%20linting/badge.svg)](https://github.com/nf-core/nanoseq/actions?query=workflow%3A%22nf-core+linting%22) [![AWS CI](https://img.shields.io/badge/CI%20tests-full%20size-FF9900?logo=Amazon%20AWS)](https://nf-co.re/nanoseq/results) -[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.XXXXXXX-1073c8)](https://doi.org/10.5281/zenodo.XXXXXXX) +[![Cite with Zenodo](http://img.shields.io/badge/DOI-10.5281/zenodo.3697959-1073c8)](https://doi.org/10.5281/zenodo.3697959) [![Nextflow](https://img.shields.io/badge/nextflow%20DSL2-%E2%89%A521.10.3-23aa62.svg)](https://www.nextflow.io/) [![run with conda](http://img.shields.io/badge/run%20with-conda-3EB049?logo=anaconda)](https://docs.conda.io/en/latest/) From ff9aa3f96e6ffb670306f6310fc62f6393cd2629 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Tue, 14 Jun 2022 07:51:59 +0800 Subject: [PATCH 164/169] Delete multiqc_config.yaml --- assets/multiqc_config.yaml | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 assets/multiqc_config.yaml diff --git a/assets/multiqc_config.yaml b/assets/multiqc_config.yaml deleted file mode 100644 index df14117a..00000000 --- a/assets/multiqc_config.yaml +++ /dev/null @@ -1,11 +0,0 @@ -report_comment: > - This report has been generated by the nf-core/nanoseq - analysis pipeline. For information about how to interpret these results, please see the - documentation. -report_section_order: - software_versions: - order: -1000 - nf-core-nanoseq-summary: - order: -1001 - -export_plots: true From 5dd124f894ab48ce88b610bb90642aae24974b4d Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Tue, 14 Jun 2022 07:55:50 +0800 Subject: [PATCH 165/169] update to multiqc_config.yml --- workflows/nanoseq.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index 02ab37e9..fa76a68c 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -110,7 +110,7 @@ if (!params.skip_quantification) { /* -- CONFIG FILES -- */ //////////////////////////////////////////////////// -ch_multiqc_config = file("$baseDir/assets/multiqc_config.yaml", checkIfExists: true) +ch_multiqc_config = file("$baseDir/assets/multiqc_config.yml", checkIfExists: true) ch_multiqc_custom_config = params.multiqc_config ? Channel.fromPath(params.multiqc_config) : Channel.empty() //////////////////////////////////////////////////// From ffdae2df57e706f29bea1186d62061e35e44f101 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Fri, 17 Jun 2022 22:57:33 +0800 Subject: [PATCH 166/169] change to nanoseq zenodo DOI --- lib/WorkflowMain.groovy | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/WorkflowMain.groovy b/lib/WorkflowMain.groovy index 21e9c4ad..f14d23a8 100755 --- a/lib/WorkflowMain.groovy +++ b/lib/WorkflowMain.groovy @@ -10,7 +10,7 @@ class WorkflowMain { public static String citation(workflow) { return "If you use ${workflow.manifest.name} for your analysis please cite:\n\n" + "* The pipeline\n" + - " https://doi.org/10.5281/zenodo.1400710\n\n" + + " https://doi.org/10.5281/zenodo.5740870\n\n" + "* The nf-core framework\n" + " https://doi.org/10.1038/s41587-020-0439-x\n\n" + "* Software dependencies\n" + From d7be929e543d524bf47dbca93bbfacec2810f550 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Sat, 18 Jun 2022 08:45:16 +0800 Subject: [PATCH 167/169] Update CITATIONS.md --- CITATIONS.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index b60833a1..38403690 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -34,7 +34,7 @@ - [JAFFAL](https://doi.org/10.1186/s13059-021-02588-5) - > Davidson NM, et al., JAFFAL: detecting fusion genes with long-read transcriptome sequencing. Genome Biology (2022) + > Davidson NM, Chen Y, Sadras T, Ryland GL, Blombery P, Ekert PG, Göke J, Oshlack A. JAFFAL: detecting fusion genes with long-read transcriptome sequencing. Genome Biol. 2022 Jan 6;23(1):10. doi: 10.1186/s13059-021-02588-5. PMID: 34991664; PMCID: PMC8739696. - [m6anet](https://www.biorxiv.org/content/10.1101/2021.09.20.461055v1) @@ -85,7 +85,7 @@ > Kent WJ, Zweig AS, Barber G, Hinrichs AS, Karolchik D. BigWig and BigBed: enabling browsing of large distributed datasets. Bioinformatics. 2010 Sep 1;26(17):2204-7. doi: 10.1093/bioinformatics/btq351. Epub 2010 Jul 17. PubMed PMID: 20639541; PubMed Central PMCID: PMC2922891. - [xPore](https://doi.org/10.1038/s41587-021-00949-w) - > Pratanwanich PN, et al.,Identification of differential RNA modifications from nanopore direct RNA sequencing with xPore. Nat Biotechnol (2021) + > Pratanwanich PN, Yao F, Chen Y, Koh CWQ, Wan YK, Hendra C, Poon P, Goh YT, Yap PML, Chooi JY, Chng WJ, Ng SB, Thiery A, Goh WSS, Göke J. Identification of differential RNA modifications from nanopore direct RNA sequencing with xPore. Nat Biotechnol. 2021 Nov;39(11):1394-1402. doi: 10.1038/s41587-021-00949-w. Epub 2021 Jul 19. PMID: 34282325. ## R packages From 17b6ff110237cf4ff382227c48bf1411e8e24005 Mon Sep 17 00:00:00 2001 From: Yuk Kei Wan <41866052+yuukiiwa@users.noreply.github.com> Date: Sat, 18 Jun 2022 08:46:18 +0800 Subject: [PATCH 168/169] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3cd6f83b..67f159f5 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ On release, automated continuous integration tests run the pipeline on a [full-s ## Pipeline Summary -1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis), [`demux_fast5`](https://github.com/nanoporetech/ont_fast5_api#demux_fast5) or [`qcat`](https://github.com/nanoporetech/qcat); _optional_) +1. Basecalling and/or demultiplexing ([`Guppy`](https://nanoporetech.com/nanopore-sequencing-data-analysis), [`demux_fast5`](https://github.com/nanoporetech/ont_fast5_api#demux_fast5), or [`qcat`](https://github.com/nanoporetech/qcat); _optional_) 2. Sequencing QC ([`pycoQC`](https://github.com/a-slide/pycoQC), [`NanoPlot`](https://github.com/wdecoster/NanoPlot)) 3. Raw read DNA cleaning ([NanoLyse](https://github.com/wdecoster/nanolyse); _optional_) 4. Raw read QC ([`NanoPlot`](https://github.com/wdecoster/NanoPlot), [`FastQC`](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/)) From f3319f11efcdd54805407a5fa57eced1bbdd11b3 Mon Sep 17 00:00:00 2001 From: yuukiiwa Date: Mon, 20 Jun 2022 17:45:34 +0800 Subject: [PATCH 169/169] address suggestions from Chris --- CITATIONS.md | 2 +- conf/test_nobc_nodx_vc.config | 4 ++-- docs/output.md | 20 ++++++++++---------- modules/local/bam_rename.nf | 3 +++ workflows/nanoseq.nf | 2 +- 5 files changed, 17 insertions(+), 14 deletions(-) diff --git a/CITATIONS.md b/CITATIONS.md index 38403690..38031c4c 100644 --- a/CITATIONS.md +++ b/CITATIONS.md @@ -64,7 +64,7 @@ - [pycoQC](https://doi.org/10.21105/joss.01236) - > Leger A, Leonardi T, (2019). pycoQC, interactive quality control for Oxford Nanopore Sequencing. Journal of Open Source Software, 4(34), 1236. + > Leger A, Leonardi T, (2019). pycoQC, interactive quality control for Oxford Nanopore Sequencing. Journal of Open Source Software, 4(34), 1236, https://doi.org/10.21105/joss.01236 - [qcat](https://github.com/nanoporetech/qcat) diff --git a/conf/test_nobc_nodx_vc.config b/conf/test_nobc_nodx_vc.config index 13d9c28b..20cee84a 100644 --- a/conf/test_nobc_nodx_vc.config +++ b/conf/test_nobc_nodx_vc.config @@ -24,6 +24,6 @@ params { skip_demultiplexing = true call_variants = true - variant_caller = 'deepvariant' - structural_variant_caller = 'cutesv' + variant_caller = 'medaka' + structural_variant_caller = 'sniffles' } diff --git a/docs/output.md b/docs/output.md index 9fe43e73..a99651b8 100644 --- a/docs/output.md +++ b/docs/output.md @@ -8,7 +8,7 @@ This document describes the output produced by the nf-core/nanoseq pipeline. Mos ## Pipeline overview -The nf-core/nanoseq pipeline is built using [Nextflow](https://www.nextflow.io/). There are many different potential outputs for the pipeline depending on what file inputs and parameters you use. Please see [`main README.md`](../README.md) for a condensed overview of the steps in the pipeline, and the bioinformatics tools used at each step. +The nf-core/nanoseq pipeline is built using [Nextflow](https://www.nextflow.io/). There are many different potential outputs for the pipeline depending on what file inputs and parameters you use. Please see [`main README.md`](../README.md) for a condensed overview of the steps in the pipeline and the bioinformatics tools used at each step. See [Oxford NanoPore website](https://nanoporetech.com/) for more information regarding the sequencing technology, protocol, and for an extensive list of additional resources. @@ -54,7 +54,7 @@ _Documentation_: [NanoLyse](https://github.com/wdecoster/nanolyse) _Description_: -If you would like to run NanoLyse on the raw FASTQ files you can provide `--run_nanolyse` when running the pipeline. By default, the pipeline will filter lambda phage reads, however you can provide your own FASTA file of "contaminants" with `--nanolyse_fasta`. The filtered FASTQ files will contain raw reads without the specified reference sequences (default: lambda phage sequences). +If you would like to run NanoLyse on the raw FASTQ files you can provide `--run_nanolyse` when running the pipeline. By default, the pipeline will filter lambda phage reads. However, you can provide your own FASTA file of "contaminants" with `--nanolyse_fasta`. The filtered FASTQ files will contain raw reads without the specified reference sequences (default: lambda phage sequences). ## Sequencing QC @@ -71,7 +71,7 @@ _Documentation_: [PycoQC](https://github.com/a-slide/pycoQC), [NanoPlot](https://github.com/wdecoster/NanoPlot) _Description_: -_PycoQC_ and _NanoPlot_ can compute QC metrics and generate plots using the sequencing summary information generated by _Guppy_ e.g. distribution of read length, read length over time, number of reads per barcode and other general stats. _NanoPlot_ can also generates QC metrics directly from FASTQ files as described in the next section. +_PycoQC_ and _NanoPlot_ can compute QC metrics and generate plots using the sequencing summary information generated by _Guppy_, e.g., distribution of read length, read length over time, number of reads per barcode and other general stats. _NanoPlot_ can also generate QC metrics directly from FASTQ files as described in the next section. ![PycoQC - Number of reads per barcode](images/pycoqc_readsperbarcode.png) @@ -90,11 +90,11 @@ _Documentation_: [NanoPlot](https://github.com/wdecoster/NanoPlot), [FastQC](http://www.bioinformatics.babraham.ac.uk/projects/fastqc/Help/) _Description_: -_NanoPlot_ can be used to produce general quality metrics from the per barcode FASTQ files generated by _Guppy_ e.g. quality score distribution, read lengths and other general stats. +_NanoPlot_ can be used to produce general quality metrics from the per barcode FASTQ files generated by _Guppy_ e.g. quality score distribution, read lengths, and other general stats. ![Nanoplot - Read quality vs read length](images/nanoplot_readlengthquality.png) -_FastQC_ can give general quality metrics about your reads. It can provide information about the quality score distribution across your reads, the per base sequence content (%A/C/G/T). You can also generate information about adapter contamination and other over-represented sequences. +_FastQC_ can give general quality metrics about your reads. It can provide information about the quality score distribution across your reads, and the per-base sequence content (%A/C/G/T). You can also generate information about adapter contamination and other over-represented sequences. ## Alignment @@ -131,7 +131,7 @@ _Documentation_: [BEDTools](https://bedtools.readthedocs.io/en/latest/), [bedGraphToBigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html#Ex3), [`bedToBigBed`](https://genome.ucsc.edu/goldenPath/help/bigBed.html#Ex2) _Description_: -The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is in an indexed binary format useful for displaying dense, continuous data in Genome Browsers such as the [UCSC](https://genome.ucsc.edu/cgi-bin/hgTracks) and [IGV](http://software.broadinstitute.org/software/igv/). This mitigates the need to load the much larger BAM file for data visualisation purposes which will be slower and result in memory issues. The bigWig format is also supported by various bioinformatics software for downstream processing such as meta-profile plotting. +The [bigWig](https://genome.ucsc.edu/goldenpath/help/bigWig.html) format is an indexed binary format useful for displaying dense, continuous data in Genome Browsers such as the [UCSC](https://genome.ucsc.edu/cgi-bin/hgTracks) and [IGV](http://software.broadinstitute.org/software/igv/). This mitigates the need to load the much larger BAM file for data visualisation purposes which will be slower and result in memory issues. The bigWig format is also supported by various bioinformatics software for downstream processing such as meta-profile plotting. [bigBed](https://genome.ucsc.edu/goldenPath/help/bigBed.html) are more useful for displaying distribution of reads across exon intervals as is typically observed for RNA-seq data. Therefore, these files will only be generated if `--protocol directRNA` or `--protocol cDNA` are defined. @@ -176,7 +176,7 @@ _Documentation_: [Sniffles](https://github.com/fritzsedlazeck/Sniffles), [cuteSV](https://github.com/tjiangHIT/cuteSV) _Description_: -If the `--protocol DNA` and the `--call_variants` parameters are defined small and structural variants. +If the `--protocol DNA` and the `--call_variants` parameters are defined then both small and structural variant variant calls can be generated. Short variants can be called using _medaka_, _deepvariant_ or _pepper_margin_deepvariant_. The short variant caller is specified using the `--variant_caller` parameter. Structural variants can be called using either _cuteSV_ or _sniffles_. The structural variant caller is specified using the `--structural_variant_caller` parameter. The short variant and/or structural variant calling steps is skipped if using the `--skip_vc` and `--skip_sniffles` flags. @@ -189,9 +189,9 @@ The short variant and/or structural variant calling steps is skipped if using th If bambu is used: - `bambu/` - - `extended_annotations.gtf`: a GTF file that contains both annotated and novel transcripts - - `counts_gene.txt`: a TXT file containing gene expression estimates - - `counts_transcript.txt`: a TXT file containing transcript expression estimates + - `extended_annotations.gtf`: a GTF file that contains both annotated and novel transcripts. + - `counts_gene.txt`: a TXT file containing gene expression estimates. + - `counts_transcript.txt`: a TXT file containing transcript expression estimates. If StringTie2 is used: diff --git a/modules/local/bam_rename.nf b/modules/local/bam_rename.nf index 940b96a8..86c28a59 100644 --- a/modules/local/bam_rename.nf +++ b/modules/local/bam_rename.nf @@ -5,6 +5,9 @@ process BAM_RENAME { //container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? // 'https://containers.biocontainers.pro/s3/SingImgsRepo/biocontainers/v1.2.0_cv1/biocontainers_v1.2.0_cv1.img' : // 'quay.io/biocontainers/biocontainers:latest' }" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + 'https://depot.galaxyproject.org/singularity/sed:4.7.0' : + 'quay.io/biocontainers/sed:4.7.0' }" input: tuple val(meta), path(bam) diff --git a/workflows/nanoseq.nf b/workflows/nanoseq.nf index fa76a68c..d55c9376 100644 --- a/workflows/nanoseq.nf +++ b/workflows/nanoseq.nf @@ -92,7 +92,7 @@ if (params.call_variants) { if (!params.skip_sv && params.structural_variant_caller != 'sniffles' && params.structural_variant_caller != 'cutesv') { exit 1, "Invalid structural variant caller option: ${params.structural_variant_caller}. Valid options: 'sniffles', 'cutesv" } - if (params.enable_conda && params.variant_caller != 'medaka') { + if (!params.skip_vc && params.enable_conda && params.variant_caller != 'medaka') { exit 1, "Conda environments cannot be used when using the deepvariant or pepper_margin_deepvariant tools. Valid options: 'docker', 'singularity'" } }