diff --git a/conf/test.config b/conf/test.config index 48635c79..ced5542f 100644 --- a/conf/test.config +++ b/conf/test.config @@ -24,8 +24,7 @@ params { use_prokka = true skip_kraken = true skip_poppunk = true - skip_phispy = true - light = true + annotation_tools = 'mobsuite,rgi,vfdb' } process { diff --git a/nextflow.config b/nextflow.config index 290b7cfd..51da8761 100755 --- a/nextflow.config +++ b/nextflow.config @@ -34,8 +34,7 @@ params { // Annotation parameters use_prokka = false bakta_db = null - light = false - run_integronfinder = false + annotation_tools = 'mobsuite,rgi,cazy,vfdb,iceberg,bacmet,islandpath,phispy' min_pident = 60 min_qcover = 0.6 skip_phispy = false diff --git a/nextflow_schema.json b/nextflow_schema.json index e06bb40d..45500c18 100644 --- a/nextflow_schema.json +++ b/nextflow_schema.json @@ -82,28 +82,24 @@ "default": "", "fa_icon": "fas fa-edit", "properties": { + "annotation_tools": { + "type": "string", + "default": "mobsuite,rgi,cazy,vfdb,iceberg,bacmet,islandpath,phispy", + "fa_icon": "fas fa-tools", + "description": "Comma-separated list of annotation tools to run", + "pattern": "^((rgi|mobsuite|islandpath|phispy|vfdb|cazy|bacmet|iceberg|integronfinder)?,?)*(? paths } - .set { rgi_tsvs } + RGI_ADD_COLUMN.out.txt + .collect{ id, paths -> paths } + .set { rgi_tsvs } - CONCAT_RGI(rgi_tsvs, "RGI", 1) + CONCAT_RGI(rgi_tsvs, "RGI", 1) + } /* * Module: Mob-Suite. Database is included in singularity container */ - MOB_RECON(assemblies) - ch_software_versions = ch_software_versions.mix(MOB_RECON.out.version.first().ifEmpty(null)) - - MOB_RECON.out.contig_report - .collect{ id, paths -> paths } - .set { mobrecon_tsvs } + if (tools_to_run.contains('mobsuite')) { + MOB_RECON(assemblies) + ch_software_versions = ch_software_versions.mix(MOB_RECON.out.version.first().ifEmpty(null)) - CONCAT_MOBSUITE(mobrecon_tsvs, "MOBSUITE", 1) + MOB_RECON.out.contig_report + .collect{ id, paths -> paths } + .set { mobrecon_tsvs } - if (params.run_integronfinder){ + CONCAT_MOBSUITE(mobrecon_tsvs, "MOBSUITE", 1) + } + if (tools_to_run.contains('integronfinder')){ INTEGRON_FINDER(assemblies) ch_software_versions = ch_software_versions.mix(INTEGRON_FINDER.out.versions.first()) @@ -223,7 +229,7 @@ workflow ANNOTATE_ASSEMBLIES { } ch_phispy_out = [] - if (!params.skip_phispy) { + if (tools_to_run.contains('phispy')) { PHISPY(ch_gbk_files) ch_software_versions = ch_software_versions.mix(PHISPY.out.versions.first()) @@ -239,36 +245,39 @@ workflow ANNOTATE_ASSEMBLIES { CONCAT_PHISPY(phispy_tsvs, "PHISPY", 1) } + if (tools_to_run.contains('islandpath')) { + ISLANDPATH(ch_gbk_files) + ch_software_versions = ch_software_versions.mix(ISLANDPATH.out.versions.first()) - ISLANDPATH(ch_gbk_files) - ch_software_versions = ch_software_versions.mix(ISLANDPATH.out.versions.first()) - - ISLANDPATH.out.gff - .collect{ id, paths -> paths } - .set { islandpath_gffs } - - CONCAT_ISLANDS(islandpath_gffs, "ISLANDPATH", 1) + ISLANDPATH.out.gff + .collect{ id, paths -> paths } + .set { islandpath_gffs } + CONCAT_ISLANDS(islandpath_gffs, "ISLANDPATH", 1) + } /* * Run DIAMOND blast annotation with databases */ ch_diamond_outs = Channel.empty() def blast_columns = "qseqid sseqid pident slen qlen length mismatch gapopen qstart qend sstart send evalue bitscore full_qseq" + if (tools_to_run.contains('vfdb')) { + DIAMOND_MAKE_VFDB(ch_vfdb) + DIAMOND_BLAST_VFDB(ch_ffn_files, DIAMOND_MAKE_VFDB.out.db, "txt", blast_columns) + VFDB_FILTER( + DIAMOND_BLAST_VFDB.out.txt, + "VFDB", + blast_columns, + min_pident, + min_qcover + ) - DIAMOND_MAKE_VFDB(ch_vfdb) - DIAMOND_BLAST_VFDB(ch_ffn_files, DIAMOND_MAKE_VFDB.out.db, "txt", blast_columns) - VFDB_FILTER( - DIAMOND_BLAST_VFDB.out.txt, - "VFDB", - blast_columns, - min_pident, - min_qcover - ) - - ch_diamond_outs.mix(VFDB_FILTER.out.concatenated).set{ ch_diamond_outs } + ch_diamond_outs.mix(VFDB_FILTER.out.concatenated) + .set{ ch_diamond_outs } - if (!params.light) { + ch_software_versions = ch_software_versions.mix(DIAMOND_MAKE_VFDB.out.versions.ifEmpty(null)) + } + if (tools_to_run.contains('bacmet')) { DIAMOND_MAKE_BACMET(ch_bacmet_db) DIAMOND_BLAST_BACMET(ch_ffn_files, DIAMOND_MAKE_BACMET.out.db, "txt", blast_columns) BACMET_FILTER( @@ -279,6 +288,10 @@ workflow ANNOTATE_ASSEMBLIES { min_qcover ) + ch_diamond_outs.mix(BACMET_FILTER.out.concatenated) + .set{ ch_diamond_outs } + } + if (tools_to_run.contains('cazy')) { DIAMOND_MAKE_CAZY(ch_cazy_db) DIAMOND_BLAST_CAZY(ch_ffn_files, DIAMOND_MAKE_CAZY.out.db, "txt", blast_columns) CAZY_FILTER( @@ -289,6 +302,10 @@ workflow ANNOTATE_ASSEMBLIES { min_qcover ) + ch_diamond_outs.mix(CAZY_FILTER.out.concatenated) + .set{ ch_diamond_outs } + } + if (tools_to_run.contains('iceberg')) { DIAMOND_MAKE_ICEBERG(ch_iceberg_db) DIAMOND_BLAST_ICEBERG(ch_ffn_files, DIAMOND_MAKE_ICEBERG.out.db, "txt", blast_columns) ICEBERG_FILTER( @@ -299,16 +316,13 @@ workflow ANNOTATE_ASSEMBLIES { min_qcover ) - ch_diamond_outs - .mix(BACMET_FILTER.out.concatenated) - .mix(CAZY_FILTER.out.concatenated) - .mix(ICEBERG_FILTER.out.concatenated) + ch_diamond_outs.mix(ICEBERG_FILTER.out.concatenated) .set { ch_diamond_outs } } - ch_software_versions = ch_software_versions.mix(DIAMOND_MAKE_VFDB.out.versions.ifEmpty(null)) - if (!params.use_prokka) { + needed_for_report = ['vfdb', 'rgi', 'mobsuite'] + if (!params.use_prokka && needed_for_report.every { it in tools_to_run }) { CREATE_REPORT( CONCAT_BAKTA.out.txt, ch_diamond_outs.collect(), @@ -317,7 +331,7 @@ workflow ANNOTATE_ASSEMBLIES { ch_phispy_out, CONCAT_MOBSUITE.out.txt ) - } else { + } else if (needed_for_report.every { it in tools_to_run }) { CREATE_REPORT( CONCAT_PROKKA.out.txt, ch_diamond_outs.collect(), diff --git a/tests/subworkflows/local/annotation.nf.test b/tests/subworkflows/local/annotation.nf.test index 72d396ab..dc4e35b7 100644 --- a/tests/subworkflows/local/annotation.nf.test +++ b/tests/subworkflows/local/annotation.nf.test @@ -9,7 +9,7 @@ nextflow_workflow { when { params { // define parameters here. Example: - light = true + annotation_tools = 'mobsuite,rgi,vfdb,islandpath' use_prokka = true min_pident = 80 min_qcover = 0.8