add Kronatools KTImportTaxonomy (#928)

* created and initialised krona module

* Added kronatools/ktimporttaxonomy module

* removing previous redundant work

* added contains info for html

* edited contains in test.yml

* Update get versions

Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com>

* remove old syntax

Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com>

* rewording module description

Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com>

* added detailed keywords

Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com>

* update syntax and tool version

* fixed meta.yml issues

* remove contains line from test.yml

* re-wrote module after nf-core/tools update - should work now

* removed md5

* Update modules/kronatools/ktimporttaxonomy/main.nf

Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com>

* update meta save

* removed typo

* double quotes to single quotes around html

* re-ran test, which updated md5

* removed md5

* 'classifier' removed to fix linting

* update version

* removed erroneous ktimporttaxonomy2

* Updated input to include meta and database

* fixed tab issues in yaml

* added `contains` to test.yml

* edited `contains` in test.yml

* trying another `contains`

* retrying `contains`

* contains with extra line

* removed classifier from tag

* Apply suggestions from code review

* Update meta.yml

Co-authored-by: Daniel Straub <42973691+d4straub@users.noreply.github.com>
Co-authored-by: Sébastien Guizard <sguizard@ed.ac.uk>
Co-authored-by: Harshil Patel <drpatelh@users.noreply.github.com>
This commit is contained in:
mjakobs 2021-11-15 17:40:46 +00:00 committed by GitHub
parent 8d9e8ae839
commit 466b964b37
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 189 additions and 0 deletions

View file

@ -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"
}
}

View file

@ -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
"""
}

View file

@ -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"

View file

@ -718,6 +718,10 @@ kronatools/kronadb:
- modules/kronatools/kronadb/** - modules/kronatools/kronadb/**
- tests/modules/kronatools/kronadb/** - tests/modules/kronatools/kronadb/**
kronatools/ktimporttaxonomy:
- modules/kronatools/ktimporttaxonomy/**
- tests/modules/kronatools/ktimporttaxonomy/**
last/dotplot: last/dotplot:
- modules/last/dotplot/** - modules/last/dotplot/**
- tests/modules/last/dotplot/** - tests/modules/last/dotplot/**

View file

@ -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 )
}

View file

@ -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"