diff --git a/modules/kronatools/ktimporttaxonomy/functions.nf b/modules/kronatools/ktimporttaxonomy/functions.nf new file mode 100644 index 00000000..85628ee0 --- /dev/null +++ b/modules/kronatools/ktimporttaxonomy/functions.nf @@ -0,0 +1,78 @@ +// +// 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/kronatools/ktimporttaxonomy/main.nf b/modules/kronatools/ktimporttaxonomy/main.nf new file mode 100644 index 00000000..893bc5b2 --- /dev/null +++ b/modules/kronatools/ktimporttaxonomy/main.nf @@ -0,0 +1,39 @@ +// Import generic module functions +include { initOptions; saveFiles; getSoftwareName; getProcessName } from './functions' + +params.options = [:] +options = initOptions(params.options) + +process KRONATOOLS_KTIMPORTTAXONOMY { + 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), meta:meta, publish_by_meta:['id']) } + + conda (params.enable_conda ? "bioconda::krona=2.8" : null) + if (workflow.containerEngine == 'singularity' && !params.singularity_pull_docker_container) { + container "https://depot.galaxyproject.org/singularity/krona:2.8--pl5262hdfd78af_2" + } else { + container "quay.io/biocontainers/krona:2.8--pl5262hdfd78af_2" + } + + input: + tuple val(meta), path(report) + path "taxonomy/taxonomy.tab" + + output: + tuple val(meta), path ('*.html'), emit: html + path "versions.yml" , emit: versions + + script: + def VERSION='2.8' + """ + ktImportTaxonomy "$report" -tax taxonomy + + cat <<-END_VERSIONS > versions.yml + ${getProcessName(task.process)}: + ${getSoftwareName(task.process)}: $VERSION + END_VERSIONS + """ +} diff --git a/modules/kronatools/ktimporttaxonomy/meta.yml b/modules/kronatools/ktimporttaxonomy/meta.yml new file mode 100644 index 00000000..f37f2db4 --- /dev/null +++ b/modules/kronatools/ktimporttaxonomy/meta.yml @@ -0,0 +1,44 @@ +name: kronatools_ktimporttaxonomy +description: KronaTools Import Taxonomy imports taxonomy classifications and produces an interactive Krona plot. +keywords: + - plot + - taxonomy + - interactive + - html + - visualisation + - krona chart +tools: + - kronatools: + description: Krona Tools is a set of scripts to create Krona charts from several Bioinformatics tools as well as from text and XML files. + homepage: https://github.com/marbl/Krona/wiki/KronaTools + documentation: http://manpages.ubuntu.com/manpages/impish/man1/ktImportTaxonomy.1.html + tool_dev_url: + doi: https://doi.org/10.1186/1471-2105-12-385 + licence: + +input: + - meta: + type: map + description: | + Groovy Map containing sample information + e.g. [ id:'test'] + - database: + type: path + description: "Path to the taxonomy database downloaded by kronatools/kronadb" + - report: + type: file + description: "A tab-delimited file with taxonomy IDs and (optionally) query IDs, magnitudes, and scores. Query IDs are taken from column 1, taxonomy IDs from column 2, and scores from column 3. Lines beginning with # will be ignored." + pattern: "*.{tsv}" + +output: + - versions: + type: file + description: File containing software versions + pattern: "versions.yml" + - html: + type: file + description: A html file containing an interactive krona plot. + pattern: "*.{html}" + +authors: + - "@mjakobs" diff --git a/tests/config/pytest_modules.yml b/tests/config/pytest_modules.yml index b286f114..b8e5e3d3 100644 --- a/tests/config/pytest_modules.yml +++ b/tests/config/pytest_modules.yml @@ -718,6 +718,10 @@ kronatools/kronadb: - modules/kronatools/kronadb/** - tests/modules/kronatools/kronadb/** +kronatools/ktimporttaxonomy: + - modules/kronatools/ktimporttaxonomy/** + - tests/modules/kronatools/ktimporttaxonomy/** + last/dotplot: - modules/last/dotplot/** - tests/modules/last/dotplot/** diff --git a/tests/modules/kronatools/ktimporttaxonomy/main.nf b/tests/modules/kronatools/ktimporttaxonomy/main.nf new file mode 100644 index 00000000..d7b08a2f --- /dev/null +++ b/tests/modules/kronatools/ktimporttaxonomy/main.nf @@ -0,0 +1,15 @@ +#!/usr/bin/env nextflow + +nextflow.enable.dsl = 2 + +include { KRONATOOLS_KTIMPORTTAXONOMY } from '../../../../modules/kronatools/ktimporttaxonomy/main.nf' addParams( options: [:] ) + +workflow test_kronatools_ktimporttaxonomy { + + input = [ [ id:'test', single_end:false ], // meta map + file(params.test_data['generic']['txt']['hello'], checkIfExists: true) ] + + taxonomy = [ file(params.test_data['generic']['txt']['hello'] , checkIfExists: true) ] + + KRONATOOLS_KTIMPORTTAXONOMY ( input, taxonomy ) +} diff --git a/tests/modules/kronatools/ktimporttaxonomy/test.yml b/tests/modules/kronatools/ktimporttaxonomy/test.yml new file mode 100644 index 00000000..15882b2e --- /dev/null +++ b/tests/modules/kronatools/ktimporttaxonomy/test.yml @@ -0,0 +1,9 @@ +- name: kronatools ktimporttaxonomy test_kronatools_ktimporttaxonomy + command: nextflow run tests/modules/kronatools/ktimporttaxonomy -entry test_kronatools_ktimporttaxonomy -c tests/config/nextflow.config + tags: + - kronatools/ktimporttaxonomy + - kronatools + files: + - path: output/kronatools/taxonomy.krona.html + contains: + - "DOCTYPE html PUBLIC"