From 3da905b0fd24c2df66882495a7efb88a01a43b51 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 14:31:16 +0100 Subject: [PATCH 01/10] chores: remove deprecated module --- deprecated/htslib/tabix/main.nf | 16 ------------ deprecated/htslib/tabix/meta.yml | 26 -------------------- deprecated/htslib/tabix/test/main.nf | 13 ---------- deprecated/htslib/tabix/test/nextflow.config | 2 -- 4 files changed, 57 deletions(-) delete mode 100644 deprecated/htslib/tabix/main.nf delete mode 100644 deprecated/htslib/tabix/meta.yml delete mode 100644 deprecated/htslib/tabix/test/main.nf delete mode 100644 deprecated/htslib/tabix/test/nextflow.config diff --git a/deprecated/htslib/tabix/main.nf b/deprecated/htslib/tabix/main.nf deleted file mode 100644 index ebd08a16..00000000 --- a/deprecated/htslib/tabix/main.nf +++ /dev/null @@ -1,16 +0,0 @@ -process htslib_tabix { - tag "$vcf" - - container 'quay.io/biocontainers/tabix:0.2.6--ha92aebf_0' - - input: - path vcf - - output: - path "${vcf}.tbi" - - script: - """ - tabix -p vcf ${vcf} - """ -} diff --git a/deprecated/htslib/tabix/meta.yml b/deprecated/htslib/tabix/meta.yml deleted file mode 100644 index b8261b92..00000000 --- a/deprecated/htslib/tabix/meta.yml +++ /dev/null @@ -1,26 +0,0 @@ -name: htslib tabix -description: create tabix index from a bgzip vcf file -keywords: - - index - - tabix -tools: - - bwa: - description: | - Generic indexer for TAB-delimited genome position files. - homepage: https://www.htslib.org/ - documentation: https://www.htslib.org/doc/tabix.1.html - doi: 10.1093/bioinformatics/btq671 -input: - - - - input: - type: file - description: Input vcf.gz file - pattern: "*.{vcf.gz}" -output: - - - - index: - type: file - description: tabix index file - pattern: "*.{vcf.gz.tbi}" -authors: - - "@maxulysse" diff --git a/deprecated/htslib/tabix/test/main.nf b/deprecated/htslib/tabix/test/main.nf deleted file mode 100644 index 478d38f5..00000000 --- a/deprecated/htslib/tabix/test/main.nf +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env nextflow -nextflow.preview.dsl = 2 -include '../../../tests/functions/check_process_outputs.nf' params(params) -include '../main.nf' params(params) - -// Define input channels -input = '../../../test-datasets/tools/file.vcf.gz' - -// Run the workflow -workflow { - tabix_index(ch_read_files) - // .check_output() -} diff --git a/deprecated/htslib/tabix/test/nextflow.config b/deprecated/htslib/tabix/test/nextflow.config deleted file mode 100644 index c137a138..00000000 --- a/deprecated/htslib/tabix/test/nextflow.config +++ /dev/null @@ -1,2 +0,0 @@ -docker.enabled = true -params.outdir = './results' From 10524e351518e0278ae1c2058de3a18046b3e887 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 14:47:53 +0100 Subject: [PATCH 02/10] chores: add modules for htslib/tabix --- .github/filters.yml | 4 ++ software/htslib/tabix/functions.nf | 59 ++++++++++++++++++++++++++++ software/htslib/tabix/main.nf | 35 +++++++++++++++++ software/htslib/tabix/meta.yml | 49 +++++++++++++++++++++++ tests/software/htslib/tabix/main.nf | 9 +++++ tests/software/htslib/tabix/test.yml | 8 ++++ 6 files changed, 164 insertions(+) create mode 100644 software/htslib/tabix/functions.nf create mode 100644 software/htslib/tabix/main.nf create mode 100644 software/htslib/tabix/meta.yml create mode 100644 tests/software/htslib/tabix/main.nf create mode 100644 tests/software/htslib/tabix/test.yml diff --git a/.github/filters.yml b/.github/filters.yml index 9fe5cdb9..2007f181 100644 --- a/.github/filters.yml +++ b/.github/filters.yml @@ -136,6 +136,10 @@ gunzip: - software/gunzip/** - tests/software/gunzip/** +htslib_tabix: + - software/htslib/tabix/** + - tests/software/htslib/tabix/** + ivar_consensus: - software/ivar/consensus/** - tests/software/ivar/consensus/** diff --git a/software/htslib/tabix/functions.nf b/software/htslib/tabix/functions.nf new file mode 100644 index 00000000..d25eea86 --- /dev/null +++ b/software/htslib/tabix/functions.nf @@ -0,0 +1,59 @@ +/* + * ----------------------------------------------------- + * 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.publish_by_id = args.publish_by_id ?: false + 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_id) { + path_list.add(args.publish_id) + } + 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/software/htslib/tabix/main.nf b/software/htslib/tabix/main.nf new file mode 100644 index 00000000..dcffba4f --- /dev/null +++ b/software/htslib/tabix/main.nf @@ -0,0 +1,35 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName } from './functions' + +params.options = [:] +def options = initOptions(params.options) + +process HTSLIB_TABIX { + tag "$vcf" + 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::tabix=0.2.6" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/tabix:0.2.6--ha92aebf_0" + } else { + container "quay.io/biocontainers/tabix:0.2.6--ha92aebf_0" + } + + input: + path vcf + + output: + path("*.tbi") , emit: tbi + path "*.version.txt" , emit: version + + script: + def software = getSoftwareName(task.process) + """ + tabix -p vcf $vcf + + echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/(.*\$//' > ${software}.version.txt + """ +} diff --git a/software/htslib/tabix/meta.yml b/software/htslib/tabix/meta.yml new file mode 100644 index 00000000..dd13ebdc --- /dev/null +++ b/software/htslib/tabix/meta.yml @@ -0,0 +1,49 @@ +name: htslib_tabix +description: create tabix index from a sorted bgzip vcf file +keywords: + - index + - tabix + - vcf +tools: + - tabix: + description: Generic indexer for TAB-delimited genome position files. + homepage: https://www.htslib.org/ + documentation: https://www.htslib.org/doc/tabix.1.html + doi: 10.1093/bioinformatics/btq671 +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 + - 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. +input: + - vcf: + type: file + description: vcf.gz file + pattern: "*.{vcf.gz}" +output: + - tbi: + type: file + description: tabix index file + pattern: "*.{tbi}" + - version: + type: file + description: File containing software version + pattern: "*.{version.txt}" +authors: + - "@maxulysse" diff --git a/tests/software/htslib/tabix/main.nf b/tests/software/htslib/tabix/main.nf new file mode 100644 index 00000000..5e2f857a --- /dev/null +++ b/tests/software/htslib/tabix/main.nf @@ -0,0 +1,9 @@ +#!/usr/bin/env nextflow + +nextflow.enable.dsl = 2 + +include { HTSLIB_TABIX } from '../../../../software/htslib/tabix/main.nf' addParams( options: [:] ) + +workflow test_htslib_tabix { + HTSLIB_TABIX ( file("${launchDir}/tests/data/vcf/test.vcf.gz", checkIfExists: true) ) +} \ No newline at end of file diff --git a/tests/software/htslib/tabix/test.yml b/tests/software/htslib/tabix/test.yml new file mode 100644 index 00000000..677c6530 --- /dev/null +++ b/tests/software/htslib/tabix/test.yml @@ -0,0 +1,8 @@ +- name: htslib tabix + command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix -c tests/config/nextflow.config + tags: + - htslib + - htslib_tabix + files: + - path: output/htslib/test.vcf.gz.tbi + md5sum: a03f56d3e968f32256ffb9f6b7d01812 From fa34f806d2218e3ffb0567b10e35138e03c494a4 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 17:06:09 +0100 Subject: [PATCH 03/10] chores: add bgzip files for tests --- tests/data/bed/B.bed.gz | Bin 0 -> 73 bytes tests/data/gff/a.gff3.gz | Bin 0 -> 80832 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 tests/data/bed/B.bed.gz create mode 100644 tests/data/gff/a.gff3.gz diff --git a/tests/data/bed/B.bed.gz b/tests/data/bed/B.bed.gz new file mode 100644 index 0000000000000000000000000000000000000000..36164ad1c553f35f054b8be58819f89710181ffe GIT binary patch literal 73 zcmb2|=3rp}f&Xj_PR>jWIt+|_3?Kg|XA~K7T3T9i8X6cHa2cFAe1{LHMjlPEGy^kO HFNgpD6~YW| literal 0 HcmV?d00001 diff --git a/tests/data/gff/a.gff3.gz b/tests/data/gff/a.gff3.gz new file mode 100644 index 0000000000000000000000000000000000000000..3561b5edd5616f0beb6e7bbd3dc97b1018f7393a GIT binary patch literal 80832 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 bp@E|AVWFXZ?r_lL Date: Tue, 16 Feb 2021 17:06:55 +0100 Subject: [PATCH 04/10] fix: make HTSLIB_TABIX more modular --- software/htslib/tabix/main.nf | 8 ++++---- software/htslib/tabix/meta.yml | 6 +++--- tests/software/htslib/tabix/main.nf | 18 ++++++++++++++---- tests/software/htslib/tabix/test.yml | 25 ++++++++++++++++++++++--- 4 files changed, 43 insertions(+), 14 deletions(-) diff --git a/software/htslib/tabix/main.nf b/software/htslib/tabix/main.nf index dcffba4f..a2369918 100644 --- a/software/htslib/tabix/main.nf +++ b/software/htslib/tabix/main.nf @@ -5,7 +5,7 @@ params.options = [:] def options = initOptions(params.options) process HTSLIB_TABIX { - tag "$vcf" + tag "$tab" label 'process_medium' publishDir "${params.outdir}", mode: params.publish_dir_mode, @@ -19,7 +19,7 @@ process HTSLIB_TABIX { } input: - path vcf + path tab output: path("*.tbi") , emit: tbi @@ -28,8 +28,8 @@ process HTSLIB_TABIX { script: def software = getSoftwareName(task.process) """ - tabix -p vcf $vcf + tabix $options.args $tab echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/(.*\$//' > ${software}.version.txt """ -} +} \ No newline at end of file diff --git a/software/htslib/tabix/meta.yml b/software/htslib/tabix/meta.yml index dd13ebdc..f25475db 100644 --- a/software/htslib/tabix/meta.yml +++ b/software/htslib/tabix/meta.yml @@ -32,10 +32,10 @@ params: Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead. input: - - vcf: + - tab: type: file - description: vcf.gz file - pattern: "*.{vcf.gz}" + description: TAB-delimited genome file + pattern: "*" output: - tbi: type: file diff --git a/tests/software/htslib/tabix/main.nf b/tests/software/htslib/tabix/main.nf index 5e2f857a..09e9be38 100644 --- a/tests/software/htslib/tabix/main.nf +++ b/tests/software/htslib/tabix/main.nf @@ -2,8 +2,18 @@ nextflow.enable.dsl = 2 -include { HTSLIB_TABIX } from '../../../../software/htslib/tabix/main.nf' addParams( options: [:] ) +include { HTSLIB_TABIX as TABIX_BED } from '../../../../software/htslib/tabix/main.nf' addParams( options: ['args': '-p bed'] ) +include { HTSLIB_TABIX as TABIX_GFF } from '../../../../software/htslib/tabix/main.nf' addParams( options: ['args': '-p gff'] ) +include { HTSLIB_TABIX as TABIX_VCF } from '../../../../software/htslib/tabix/main.nf' addParams( options: ['args': '-p vcf'] ) -workflow test_htslib_tabix { - HTSLIB_TABIX ( file("${launchDir}/tests/data/vcf/test.vcf.gz", checkIfExists: true) ) -} \ No newline at end of file +workflow test_htslib_tabix_bed { + TABIX_BED ( file("${launchDir}/tests/data/bed/B.bed.gz", checkIfExists: true) ) +} + +workflow test_htslib_tabix_gff { + TABIX_GFF ( file("${launchDir}/tests/data/gff/a.gff3.gz", checkIfExists: true) ) +} + +workflow test_htslib_tabix_vcf { + TABIX_VCF ( file("${launchDir}/tests/data/vcf/test.vcf.gz", checkIfExists: true) ) +} diff --git a/tests/software/htslib/tabix/test.yml b/tests/software/htslib/tabix/test.yml index 677c6530..f093bd73 100644 --- a/tests/software/htslib/tabix/test.yml +++ b/tests/software/htslib/tabix/test.yml @@ -1,8 +1,27 @@ -- name: htslib tabix - command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix -c tests/config/nextflow.config +- name: htslib tabix bed + command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix_bed -c tests/config/nextflow.config tags: - htslib - htslib_tabix + - bed files: - - path: output/htslib/test.vcf.gz.tbi + - path: output/tabix/B.bed.gz.tbi + md5sum: 6d657159c283200109f2ed082296f853 +- name: htslib tabix gff + command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix_gff -c tests/config/nextflow.config + tags: + - htslib + - htslib_tabix + - gff + files: + - path: output/tabix/a.gff3.gz.tbi + md5sum: 77f666b63da45c6af8a394ab5642602e +- name: htslib tabix vcf + command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix_vcf -c tests/config/nextflow.config + tags: + - htslib + - htslib_tabix + - vcf + files: + - path: output/tabix/test.vcf.gz.tbi md5sum: a03f56d3e968f32256ffb9f6b7d01812 From 274897f1fdf54017b60780a9e2991d4f493de3c5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 17:11:50 +0100 Subject: [PATCH 05/10] fix: ECLint: Wrong line endings or new final newline --- software/htslib/tabix/main.nf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/software/htslib/tabix/main.nf b/software/htslib/tabix/main.nf index a2369918..9a45654d 100644 --- a/software/htslib/tabix/main.nf +++ b/software/htslib/tabix/main.nf @@ -32,4 +32,4 @@ process HTSLIB_TABIX { echo \$(tabix -h 2>&1) | sed 's/^.*Version: //; s/(.*\$//' > ${software}.version.txt """ -} \ No newline at end of file +} From f660324508079f1fab2b7dc24fb338437ba8014f Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 18:20:43 +0100 Subject: [PATCH 06/10] chores: move file --- software/{htslib => tabix}/tabix/functions.nf | 0 software/{htslib => tabix}/tabix/main.nf | 0 software/{htslib => tabix}/tabix/meta.yml | 0 tests/software/{htslib => tabix}/tabix/main.nf | 0 tests/software/{htslib => tabix}/tabix/test.yml | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename software/{htslib => tabix}/tabix/functions.nf (100%) rename software/{htslib => tabix}/tabix/main.nf (100%) rename software/{htslib => tabix}/tabix/meta.yml (100%) rename tests/software/{htslib => tabix}/tabix/main.nf (100%) rename tests/software/{htslib => tabix}/tabix/test.yml (100%) diff --git a/software/htslib/tabix/functions.nf b/software/tabix/tabix/functions.nf similarity index 100% rename from software/htslib/tabix/functions.nf rename to software/tabix/tabix/functions.nf diff --git a/software/htslib/tabix/main.nf b/software/tabix/tabix/main.nf similarity index 100% rename from software/htslib/tabix/main.nf rename to software/tabix/tabix/main.nf diff --git a/software/htslib/tabix/meta.yml b/software/tabix/tabix/meta.yml similarity index 100% rename from software/htslib/tabix/meta.yml rename to software/tabix/tabix/meta.yml diff --git a/tests/software/htslib/tabix/main.nf b/tests/software/tabix/tabix/main.nf similarity index 100% rename from tests/software/htslib/tabix/main.nf rename to tests/software/tabix/tabix/main.nf diff --git a/tests/software/htslib/tabix/test.yml b/tests/software/tabix/tabix/test.yml similarity index 100% rename from tests/software/htslib/tabix/test.yml rename to tests/software/tabix/tabix/test.yml From edf5fa3cf60431ca37bee0a856fd7daaceef03d7 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 18:27:13 +0100 Subject: [PATCH 07/10] fix: merge bcftools/tabix and htslib/tabix into tabix/tabix --- software/bcftools/tabix/functions.nf | 60 -------------------------- software/bcftools/tabix/main.nf | 33 --------------- software/bcftools/tabix/meta.yml | 63 ---------------------------- software/tabix/tabix/main.nf | 12 +++--- software/tabix/tabix/meta.yml | 22 +++++++--- 5 files changed, 23 insertions(+), 167 deletions(-) delete mode 100644 software/bcftools/tabix/functions.nf delete mode 100644 software/bcftools/tabix/main.nf delete mode 100644 software/bcftools/tabix/meta.yml diff --git a/software/bcftools/tabix/functions.nf b/software/bcftools/tabix/functions.nf deleted file mode 100644 index 6f3b4b29..00000000 --- a/software/bcftools/tabix/functions.nf +++ /dev/null @@ -1,60 +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.publish_by_id = args.publish_by_id ?: false - 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_id) { - path_list.add(args.publish_id) - } - 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/software/bcftools/tabix/main.nf b/software/bcftools/tabix/main.nf deleted file mode 100644 index c1799bc3..00000000 --- a/software/bcftools/tabix/main.nf +++ /dev/null @@ -1,33 +0,0 @@ -// Import generic module functions -include { initOptions; saveFiles; getSoftwareName } from './functions' - -params.options = [:] -def options = initOptions(params.options) - -process BCFTOOLS_TABIX { - tag "$meta.id" - 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::bcftools=1.11=h7c999a4_0" : null) - if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { - container "https://depot.galaxyproject.org/singularity/bcftools:1.11--h7c999a4_0" - } else { - container "quay.io/biocontainers/bcftools:1.11--h7c999a4_0" - } - - input: - tuple val(meta), path(vcf) - - output: - tuple val(meta), path("*.tbi"), emit: tbi - path "*.version.txt" , emit: version - - script: - def software = getSoftwareName(task.process) - """ - tabix $options.args $vcf - echo \$(bcftools --version 2>&1) | sed 's/^.*bcftools //; s/ .*\$//' > ${software}.version.txt - """ -} diff --git a/software/bcftools/tabix/meta.yml b/software/bcftools/tabix/meta.yml deleted file mode 100644 index ea4c9d1a..00000000 --- a/software/bcftools/tabix/meta.yml +++ /dev/null @@ -1,63 +0,0 @@ -name: bcftools_tabix -description: Index GFF/BED/SAM/VCF file -keywords: - - index - - vcf - - bed - - sam - - gff -tools: - - stats: - description: | - Indexes a TAB-delimited genome position file. - homepage: http://samtools.github.io/bcftools/bcftools.html - documentation: http://www.htslib.org/doc/bcftools.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 - - 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. -input: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - vcf: - type: file - description: TAB-delimited genome position file compressed with bgzip - pattern: "*.{vcf.gz,bed.gz,sam.gz,gff.gz}" -output: - - meta: - type: map - description: | - Groovy Map containing sample information - e.g. [ id:'test', single_end:false ] - - tbi: - type: file - description: Index file - pattern: "*.{tbi}" - - version: - type: file - description: File containing software version - pattern: "*.{version.txt}" -authors: - - "@joseespinosa" - - "@drpatelh" diff --git a/software/tabix/tabix/main.nf b/software/tabix/tabix/main.nf index 9a45654d..0416a00d 100644 --- a/software/tabix/tabix/main.nf +++ b/software/tabix/tabix/main.nf @@ -4,12 +4,12 @@ include { initOptions; saveFiles; getSoftwareName } from './functions' params.options = [:] def options = initOptions(params.options) -process HTSLIB_TABIX { - tag "$tab" +process TABIX_TABIX { + 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:'') } + saveAs: { filename -> saveFiles(filename:filename, options:params.options, publish_dir:getSoftwareName(task.process), publish_id:meta.id) } conda (params.enable_conda ? "bioconda::tabix=0.2.6" : null) if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { @@ -19,11 +19,11 @@ process HTSLIB_TABIX { } input: - path tab + tuple val(meta), path(tab) output: - path("*.tbi") , emit: tbi - path "*.version.txt" , emit: version + tuple val(meta), path("*.tbi"), emit: tbi + path "*.version.txt" , emit: version script: def software = getSoftwareName(task.process) diff --git a/software/tabix/tabix/meta.yml b/software/tabix/tabix/meta.yml index f25475db..8075184a 100644 --- a/software/tabix/tabix/meta.yml +++ b/software/tabix/tabix/meta.yml @@ -1,5 +1,5 @@ -name: htslib_tabix -description: create tabix index from a sorted bgzip vcf file +name: tabix_tabix +description: create tabix index from a sorted bgzip tab-delimited genome file keywords: - index - tabix @@ -7,7 +7,7 @@ keywords: tools: - tabix: description: Generic indexer for TAB-delimited genome position files. - homepage: https://www.htslib.org/ + homepage: https://www.htslib.org/doc/tabix.html documentation: https://www.htslib.org/doc/tabix.1.html doi: 10.1093/bioinformatics/btq671 params: @@ -32,11 +32,21 @@ params: Instead of directly downloading Singularity images for use with Singularity, force the workflow to pull and convert Docker containers instead. input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test', single_end:false ] - tab: type: file - description: TAB-delimited genome file - pattern: "*" + 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 @@ -46,4 +56,6 @@ output: description: File containing software version pattern: "*.{version.txt}" authors: + - "@joseespinosa" + - "@drpatelh" - "@maxulysse" From 5a144d6213ed58def903133a52e61127f395b91c Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 18:35:32 +0100 Subject: [PATCH 08/10] fix: merge bcftools/tabix and htslib/tabix tests into tabix/tabix --- tests/software/bcftools/tabix/main.nf | 14 ------------ tests/software/bcftools/tabix/test.yml | 8 ------- tests/software/tabix/tabix/main.nf | 30 ++++++++++++++++++-------- tests/software/tabix/tabix/test.yml | 26 +++++++++++----------- 4 files changed, 34 insertions(+), 44 deletions(-) delete mode 100644 tests/software/bcftools/tabix/main.nf delete mode 100644 tests/software/bcftools/tabix/test.yml diff --git a/tests/software/bcftools/tabix/main.nf b/tests/software/bcftools/tabix/main.nf deleted file mode 100644 index 8a0f8ec6..00000000 --- a/tests/software/bcftools/tabix/main.nf +++ /dev/null @@ -1,14 +0,0 @@ -#!/usr/bin/env nextflow - -nextflow.enable.dsl = 2 - -include { BCFTOOLS_TABIX } from '../../../../software/bcftools/tabix/main.nf' addParams( options: [:] ) - -workflow test_bcftools_tabix { - - def input = [] - input = [ [ id:'test' ], // meta map - [ file("${launchDir}/tests/data/vcf/test.vcf.gz", checkIfExists: true) ] ] - - BCFTOOLS_TABIX ( input ) -} diff --git a/tests/software/bcftools/tabix/test.yml b/tests/software/bcftools/tabix/test.yml deleted file mode 100644 index 0356b1a8..00000000 --- a/tests/software/bcftools/tabix/test.yml +++ /dev/null @@ -1,8 +0,0 @@ -- name: bcftools tabix - command: nextflow run ./tests/software/bcftools/tabix -entry test_bcftools_tabix -c tests/config/nextflow.config - tags: - - bcftools - - bcftools_tabix - files: - - path: output/bcftools/test.vcf.gz.tbi - md5sum: 06d52177f819730dd409157914534e8d diff --git a/tests/software/tabix/tabix/main.nf b/tests/software/tabix/tabix/main.nf index 09e9be38..38e82a70 100644 --- a/tests/software/tabix/tabix/main.nf +++ b/tests/software/tabix/tabix/main.nf @@ -2,18 +2,30 @@ nextflow.enable.dsl = 2 -include { HTSLIB_TABIX as TABIX_BED } from '../../../../software/htslib/tabix/main.nf' addParams( options: ['args': '-p bed'] ) -include { HTSLIB_TABIX as TABIX_GFF } from '../../../../software/htslib/tabix/main.nf' addParams( options: ['args': '-p gff'] ) -include { HTSLIB_TABIX as TABIX_VCF } from '../../../../software/htslib/tabix/main.nf' addParams( options: ['args': '-p vcf'] ) +include { TABIX_TABIX as TABIX_BED } from '../../../../software/tabix/tabix/main.nf' addParams( options: ['args': '-p bed'] ) +include { TABIX_TABIX as TABIX_GFF } from '../../../../software/tabix/tabix/main.nf' addParams( options: ['args': '-p gff'] ) +include { TABIX_TABIX as TABIX_VCF } from '../../../../software/tabix/tabix/main.nf' addParams( options: ['args': '-p vcf'] ) -workflow test_htslib_tabix_bed { - TABIX_BED ( file("${launchDir}/tests/data/bed/B.bed.gz", checkIfExists: true) ) +workflow test_tabix_tabix_bed { + def input = [] + input = [ [ id:'B.bed' ], // meta map + [ file("${launchDir}/tests/data/bed/B.bed.gz", checkIfExists: true) ] ] + + TABIX_BED ( input ) } -workflow test_htslib_tabix_gff { - TABIX_GFF ( file("${launchDir}/tests/data/gff/a.gff3.gz", checkIfExists: true) ) +workflow test_tabix_tabix_gff { + def input = [] + input = [ [ id:'a.gff3' ], // meta map + [ file("${launchDir}/tests/data/gff/a.gff3.gz", checkIfExists: true) ] ] + + TABIX_GFF ( input ) } -workflow test_htslib_tabix_vcf { - TABIX_VCF ( file("${launchDir}/tests/data/vcf/test.vcf.gz", checkIfExists: true) ) +workflow test_tabix_tabix_vcf { + def input = [] + input = [ [ id:'test.vcf' ], // meta map + [ file("${launchDir}/tests/data/vcf/test.vcf.gz", checkIfExists: true) ] ] + + TABIX_VCF ( input ) } diff --git a/tests/software/tabix/tabix/test.yml b/tests/software/tabix/tabix/test.yml index f093bd73..64b5145b 100644 --- a/tests/software/tabix/tabix/test.yml +++ b/tests/software/tabix/tabix/test.yml @@ -1,27 +1,27 @@ -- name: htslib tabix bed - command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix_bed -c tests/config/nextflow.config +- name: tabix tabix bed + command: nextflow run ./tests/software/tabix/tabix -entry test_tabix_tabix_bed -c tests/config/nextflow.config tags: - - htslib - - htslib_tabix + - tabix + - tabix_tabix - bed files: - path: output/tabix/B.bed.gz.tbi md5sum: 6d657159c283200109f2ed082296f853 -- name: htslib tabix gff - command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix_gff -c tests/config/nextflow.config +- name: tabix tabix gff + command: nextflow run ./tests/software/tabix/tabix -entry test_tabix_tabix_gff -c tests/config/nextflow.config tags: - - htslib - - htslib_tabix + - tabix + - tabix_tabix - gff files: - path: output/tabix/a.gff3.gz.tbi md5sum: 77f666b63da45c6af8a394ab5642602e -- name: htslib tabix vcf - command: nextflow run ./tests/software/htslib/tabix -entry test_htslib_tabix_vcf -c tests/config/nextflow.config +- name: tabix tabix vcf + command: nextflow run ./tests/software/tabix/tabix -entry test_tabix_tabix_vcf -c tests/config/nextflow.config tags: - - htslib - - htslib_tabix + - tabix + - tabix_tabix - vcf files: - path: output/tabix/test.vcf.gz.tbi - md5sum: a03f56d3e968f32256ffb9f6b7d01812 + md5sum: a03f56d3e968f32256ffb9f6b7d01812 \ No newline at end of file From 3805eb2dd1c87f5f51f26ee5709545ebbe5eb8f5 Mon Sep 17 00:00:00 2001 From: MaxUlysse Date: Tue, 16 Feb 2021 18:38:20 +0100 Subject: [PATCH 09/10] fix: remove bcftools/tabix from filters.yml --- .github/filters.yml | 4 ---- 1 file changed, 4 deletions(-) diff --git a/.github/filters.yml b/.github/filters.yml index 2007f181..0f96a6e6 100644 --- a/.github/filters.yml +++ b/.github/filters.yml @@ -26,10 +26,6 @@ bcftools_stats: - software/bcftools/stats/** - tests/software/bcftools/stats/** -bcftools_tabix: - - software/bcftools/tabix/** - - tests/software/bcftools/tabix/** - bedtools_complement: - software/bedtools/complement/** - tests/software/bedtools/complement/** From 759079796a261d5d6dbb3927765f34b586532392 Mon Sep 17 00:00:00 2001 From: Harshil Patel Date: Tue, 16 Feb 2021 22:24:49 +0000 Subject: [PATCH 10/10] Update .github/filters.yml --- .github/filters.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/filters.yml b/.github/filters.yml index 0f96a6e6..daa06d84 100644 --- a/.github/filters.yml +++ b/.github/filters.yml @@ -132,9 +132,9 @@ gunzip: - software/gunzip/** - tests/software/gunzip/** -htslib_tabix: - - software/htslib/tabix/** - - tests/software/htslib/tabix/** +tabix_tabix: + - software/tabix/tabix/** + - tests/software/tabix/tabix/** ivar_consensus: - software/ivar/consensus/**