Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 7 additions & 2 deletions modules.json
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,11 @@
"git_sha": "81880787133db07d9b4c1febd152c090eb8325dc",
"installed_by": ["modules"]
},
"gecco/convert": {
"branch": "master",
"git_sha": "2aa243bd8a9b20122ed6fb5d2d3c75b963eef171",
"installed_by": ["modules"]
},
"gecco/run": {
"branch": "master",
"git_sha": "81880787133db07d9b4c1febd152c090eb8325dc",
Expand Down Expand Up @@ -192,12 +197,12 @@
},
"rgi/cardannotation": {
"branch": "master",
"git_sha": "531d8a465158c5842f416623017997462a240e16",
"git_sha": "70c072e30155e7671be828762be16576bd4afca7",
"installed_by": ["modules"]
},
"rgi/main": {
"branch": "master",
"git_sha": "531d8a465158c5842f416623017997462a240e16",
"git_sha": "70c072e30155e7671be828762be16576bd4afca7",
"installed_by": ["modules"]
},
"seqkit/seq": {
Expand Down
4 changes: 2 additions & 2 deletions modules/nf-core/rgi/cardannotation/main.nf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions modules/nf-core/rgi/main/main.nf

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

214 changes: 109 additions & 105 deletions subworkflows/local/amp.nf
Original file line number Diff line number Diff line change
Expand Up @@ -2,164 +2,168 @@
Run AMP screening tools
*/

include { MACREL_CONTIGS } from '../../modules/nf-core/macrel/contigs/main'
include { HMMER_HMMSEARCH as AMP_HMMER_HMMSEARCH } from '../../modules/nf-core/hmmer/hmmsearch/main'
include { AMPLIFY_PREDICT } from '../../modules/nf-core/amplify/predict/main'
include { AMPIR } from '../../modules/nf-core/ampir/main'
include { AMP_DATABASE_DOWNLOAD } from '../../modules/local/amp_database_download'
include { AMPCOMBI2_PARSETABLES } from '../../modules/nf-core/ampcombi2/parsetables'
include { AMPCOMBI2_COMPLETE } from '../../modules/nf-core/ampcombi2/complete'
include { AMPCOMBI2_CLUSTER } from '../../modules/nf-core/ampcombi2/cluster'
include { GUNZIP as GUNZIP_MACREL_PRED ; GUNZIP as GUNZIP_MACREL_ORFS } from '../../modules/nf-core/gunzip/main'
include { GUNZIP as AMP_GUNZIP_HMMER_HMMSEARCH } from '../../modules/nf-core/gunzip/main'
include { TABIX_BGZIP as AMP_TABIX_BGZIP } from '../../modules/nf-core/tabix/bgzip/main'
include { MERGE_TAXONOMY_AMPCOMBI } from '../../modules/local/merge_taxonomy_ampcombi'
include { MACREL_CONTIGS } from '../../modules/nf-core/macrel/contigs'
include { HMMER_HMMSEARCH as AMP_HMMER_HMMSEARCH } from '../../modules/nf-core/hmmer/hmmsearch'
include { AMPLIFY_PREDICT } from '../../modules/nf-core/amplify/predict'
include { AMPIR } from '../../modules/nf-core/ampir'
include { AMP_DATABASE_DOWNLOAD } from '../../modules/local/amp_database_download'
include { AMPCOMBI2_PARSETABLES } from '../../modules/nf-core/ampcombi2/parsetables'
include { AMPCOMBI2_COMPLETE } from '../../modules/nf-core/ampcombi2/complete'
include { AMPCOMBI2_CLUSTER } from '../../modules/nf-core/ampcombi2/cluster'
include { GUNZIP as GUNZIP_MACREL_PRED ; GUNZIP as GUNZIP_MACREL_ORFS } from '../../modules/nf-core/gunzip'
include { GUNZIP as AMP_GUNZIP_HMMER_HMMSEARCH } from '../../modules/nf-core/gunzip'
include { TABIX_BGZIP as AMP_TABIX_BGZIP } from '../../modules/nf-core/tabix/bgzip'
include { MERGE_TAXONOMY_AMPCOMBI } from '../../modules/local/merge_taxonomy_ampcombi'

workflow AMP {
take:
fastas // tuple val(meta), path(contigs)
faas // tuple val(meta), path(PROKKA/PRODIGAL.out.faa)
tsvs // tuple val(meta), path(MMSEQS_CREATETSV.out.tsv)
gbks // tuple val(meta), path(ANNOTATION_ANNOTATION_TOOL.out.gbk)
tsvs_interpro // tuple val(meta), path(INTERPROSCAN.out.tsv)'
fastas // tuple val(meta), path(contigs)
faas // tuple val(meta), path(PROKKA/PRODIGAL.out.faa)
tsvs // tuple val(meta), path(MMSEQS_CREATETSV.out.tsv)
gbks // tuple val(meta), path(ANNOTATION_ANNOTATION_TOOL.out.gbk)
tsvs_interpro // tuple val(meta), path(INTERPROSCAN.out.tsv)'

main:
ch_versions = Channel.empty()
ch_ampresults_for_ampcombi = Channel.empty()
ch_macrel_faa = Channel.empty()
ch_ampcombi_summaries = Channel.empty()
ch_ampcombi_complete = null
ch_versions = channel.empty()
ch_ampresults_for_ampcombi = channel.empty()
ch_macrel_faa = channel.empty()
ch_ampcombi_summaries = channel.empty()
ch_ampcombi_complete = null

// When adding new tool that requires FAA, make sure to update conditions
// in funcscan.nf around annotation and AMP subworkflow execution
// to ensure annotation is executed!
ch_faa_for_amplify = faas
ch_faa_for_amp_hmmsearch = faas
ch_faa_for_ampir = faas
ch_faa_for_ampcombi = faas
ch_gbk_for_ampcombi = gbks
ch_interpro_for_ampcombi = tsvs_interpro
ch_faa_for_amplify = faas
ch_faa_for_amp_hmmsearch = faas
ch_faa_for_ampir = faas
ch_faa_for_ampcombi = faas
ch_gbk_for_ampcombi = gbks
ch_interpro_for_ampcombi = tsvs_interpro

// AMPLIFY
if ( !params.amp_skip_amplify ) {
AMPLIFY_PREDICT ( ch_faa_for_amplify, [] )
ch_versions = ch_versions.mix( AMPLIFY_PREDICT.out.versions )
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix( AMPLIFY_PREDICT.out.tsv )
if (!params.amp_skip_amplify) {
AMPLIFY_PREDICT(ch_faa_for_amplify, [])
ch_versions = ch_versions.mix(AMPLIFY_PREDICT.out.versions)
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix(AMPLIFY_PREDICT.out.tsv)
}

// MACREL
if ( !params.amp_skip_macrel ) {
MACREL_CONTIGS ( fastas )
ch_versions = ch_versions.mix( MACREL_CONTIGS.out.versions )
GUNZIP_MACREL_PRED ( MACREL_CONTIGS.out.amp_prediction )
GUNZIP_MACREL_ORFS ( MACREL_CONTIGS.out.all_orfs )
ch_versions = ch_versions.mix( GUNZIP_MACREL_PRED.out.versions )
ch_versions = ch_versions.mix( GUNZIP_MACREL_ORFS.out.versions )
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix( GUNZIP_MACREL_PRED.out.gunzip )
ch_macrel_faa = ch_macrel_faa.mix( GUNZIP_MACREL_ORFS.out.gunzip )
ch_faa_for_ampcombi = ch_faa_for_ampcombi.mix( ch_macrel_faa )
if (!params.amp_skip_macrel) {
MACREL_CONTIGS(fastas)
ch_versions = ch_versions.mix(MACREL_CONTIGS.out.versions)
GUNZIP_MACREL_PRED(MACREL_CONTIGS.out.amp_prediction)
GUNZIP_MACREL_ORFS(MACREL_CONTIGS.out.all_orfs)
ch_versions = ch_versions.mix(GUNZIP_MACREL_PRED.out.versions)
ch_versions = ch_versions.mix(GUNZIP_MACREL_ORFS.out.versions)
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix(GUNZIP_MACREL_PRED.out.gunzip)
ch_macrel_faa = ch_macrel_faa.mix(GUNZIP_MACREL_ORFS.out.gunzip)
ch_faa_for_ampcombi = ch_faa_for_ampcombi.mix(ch_macrel_faa)
}

// AMPIR
if ( !params.amp_skip_ampir ) {
AMPIR ( ch_faa_for_ampir, params.amp_ampir_model, params.amp_ampir_minlength, 0.0 )
ch_versions = ch_versions.mix( AMPIR.out.versions )
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix( AMPIR.out.amps_tsv )
if (!params.amp_skip_ampir) {
AMPIR(ch_faa_for_ampir, params.amp_ampir_model, params.amp_ampir_minlength, 0.0)
ch_versions = ch_versions.mix(AMPIR.out.versions)
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix(AMPIR.out.amps_tsv)
}

// HMMSEARCH
if ( params.amp_run_hmmsearch ) {
if ( params.amp_hmmsearch_models ) { ch_amp_hmm_models = Channel.fromPath( params.amp_hmmsearch_models, checkIfExists: true ) } else { error('[nf-core/funcscan] error: HMM model files not found for --amp_hmmsearch_models! Please check input.') }

ch_amp_hmm_models_meta = ch_amp_hmm_models
.map {
file ->
def meta = [:]
meta['id'] = file.extension == 'gz' ? file.name - '.hmm.gz' : file.name - '.hmm'
[ meta, file ]
}
if (params.amp_run_hmmsearch) {
if (params.amp_hmmsearch_models) {
ch_amp_hmm_models = channel.fromPath(params.amp_hmmsearch_models, checkIfExists: true)
}
else {
error('[nf-core/funcscan] error: HMM model files not found for --amp_hmmsearch_models! Please check input.')
}

ch_amp_hmm_models_meta = ch_amp_hmm_models.map { file ->
def meta = [:]
meta['id'] = file.extension == 'gz' ? file.name - '.hmm.gz' : file.name - '.hmm'
[meta, file]
}

ch_in_for_amp_hmmsearch = ch_faa_for_amp_hmmsearch
.combine( ch_amp_hmm_models_meta )
.map {
meta_faa, faa, meta_hmm, hmm ->
def meta_new = [:]
meta_new['id'] = meta_faa['id']
meta_new['hmm_id'] = meta_hmm['id']
[ meta_new, hmm, faa, params.amp_hmmsearch_savealignments, params.amp_hmmsearch_savetargets, params.amp_hmmsearch_savedomains ]
}

AMP_HMMER_HMMSEARCH ( ch_in_for_amp_hmmsearch )
ch_versions = ch_versions.mix( AMP_HMMER_HMMSEARCH.out.versions )
AMP_GUNZIP_HMMER_HMMSEARCH ( AMP_HMMER_HMMSEARCH.out.output )
ch_versions = ch_versions.mix( AMP_GUNZIP_HMMER_HMMSEARCH.out.versions )
ch_AMP_GUNZIP_HMMER_HMMSEARCH = AMP_GUNZIP_HMMER_HMMSEARCH.out.gunzip
.map { meta, file ->
[ [id: meta.id], file ]
.combine(ch_amp_hmm_models_meta)
.map { meta_faa, faa, meta_hmm, hmm ->
def meta_new = [:]
meta_new['id'] = meta_faa['id']
meta_new['hmm_id'] = meta_hmm['id']
[meta_new, hmm, faa, params.amp_hmmsearch_savealignments, params.amp_hmmsearch_savetargets, params.amp_hmmsearch_savedomains]
}
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix( ch_AMP_GUNZIP_HMMER_HMMSEARCH )

AMP_HMMER_HMMSEARCH(ch_in_for_amp_hmmsearch)
ch_versions = ch_versions.mix(AMP_HMMER_HMMSEARCH.out.versions)
AMP_GUNZIP_HMMER_HMMSEARCH(AMP_HMMER_HMMSEARCH.out.output)
ch_versions = ch_versions.mix(AMP_GUNZIP_HMMER_HMMSEARCH.out.versions)
ch_AMP_GUNZIP_HMMER_HMMSEARCH = AMP_GUNZIP_HMMER_HMMSEARCH.out.gunzip.map { meta, file ->
[[id: meta.id], file]
}
ch_ampresults_for_ampcombi = ch_ampresults_for_ampcombi.mix(ch_AMP_GUNZIP_HMMER_HMMSEARCH)
}

// AMPCOMBI2
ch_input_for_ampcombi = ch_ampresults_for_ampcombi
.groupTuple()
.join( ch_faa_for_ampcombi )
.join( ch_gbk_for_ampcombi )
.join( ch_interpro_for_ampcombi )
.multiMap{
input: [ it[0], it[1] ]
.join(ch_faa_for_ampcombi)
.join(ch_gbk_for_ampcombi)
.join(ch_interpro_for_ampcombi)
.multiMap {
input: [it[0], it[1]]
faa: it[2]
gbk: it[3]
interpro: it [4]
interpro: it[4]
}

// AMPCOMBI2::PARSETABLES
if ( params.amp_ampcombi_db != null ) {
AMPCOMBI2_PARSETABLES ( ch_input_for_ampcombi.input, ch_input_for_ampcombi.faa, ch_input_for_ampcombi.gbk, params.amp_ampcombi_db_id, params.amp_ampcombi_db, ch_input_for_ampcombi.interpro )
} else {
AMP_DATABASE_DOWNLOAD( params.amp_ampcombi_db_id )
ch_versions = ch_versions.mix( AMP_DATABASE_DOWNLOAD.out.versions )
if (params.amp_ampcombi_db != null) {
AMPCOMBI2_PARSETABLES(ch_input_for_ampcombi.input, ch_input_for_ampcombi.faa, ch_input_for_ampcombi.gbk, params.amp_ampcombi_db_id, params.amp_ampcombi_db, ch_input_for_ampcombi.interpro)
}
else {
AMP_DATABASE_DOWNLOAD(params.amp_ampcombi_db_id)
ch_versions = ch_versions.mix(AMP_DATABASE_DOWNLOAD.out.versions)
ch_ampcombi_input_db = AMP_DATABASE_DOWNLOAD.out.db
AMPCOMBI2_PARSETABLES ( ch_input_for_ampcombi.input, ch_input_for_ampcombi.faa, ch_input_for_ampcombi.gbk, params.amp_ampcombi_db_id, ch_ampcombi_input_db, ch_input_for_ampcombi.interpro )
AMPCOMBI2_PARSETABLES(ch_input_for_ampcombi.input, ch_input_for_ampcombi.faa, ch_input_for_ampcombi.gbk, params.amp_ampcombi_db_id, ch_ampcombi_input_db, ch_input_for_ampcombi.interpro)
}
ch_versions = ch_versions.mix( AMPCOMBI2_PARSETABLES.out.versions )
ch_versions = ch_versions.mix(AMPCOMBI2_PARSETABLES.out.versions)

ch_ampcombi_summaries = AMPCOMBI2_PARSETABLES.out.tsv.map{ it[1] }.collect()
ch_ampcombi_summaries = AMPCOMBI2_PARSETABLES.out.tsv.map { it[1] }.collect()

// AMPCOMBI2::COMPLETE
ch_summary_count = ch_ampcombi_summaries.map { it.size() }.sum()

if ( ch_summary_count == 0 || ch_summary_count == 1 ) {
if (ch_summary_count == 0 || ch_summary_count == 1) {
log.warn("[nf-core/funcscan] AMPCOMBI2: ${ch_summary_count} file(s) passed. Skipping AMPCOMBI2_COMPLETE, AMPCOMBI2_CLUSTER, and TAXONOMY MERGING steps.")
} else {
}
else {
AMPCOMBI2_COMPLETE(ch_ampcombi_summaries)
ch_versions = ch_versions.mix( AMPCOMBI2_COMPLETE.out.versions )
ch_ampcombi_complete = AMPCOMBI2_COMPLETE.out.tsv
.filter { file -> file.countLines() > 1 }
ch_versions = ch_versions.mix(AMPCOMBI2_COMPLETE.out.versions)
ch_ampcombi_complete = AMPCOMBI2_COMPLETE.out.tsv.filter { file -> file.countLines() > 1 }
}

// AMPCOMBI2::CLUSTER
if ( ch_ampcombi_complete != null ) {
AMPCOMBI2_CLUSTER ( ch_ampcombi_complete )
ch_versions = ch_versions.mix( AMPCOMBI2_CLUSTER.out.versions )
} else {
if (ch_ampcombi_complete != null) {
AMPCOMBI2_CLUSTER(ch_ampcombi_complete)
ch_versions = ch_versions.mix(AMPCOMBI2_CLUSTER.out.versions)
}
else {
log.warn("[nf-core/funcscan] No AMP hits were found in the samples and so no clustering will be applied.")
}

// MERGE_TAXONOMY
if ( params.run_taxa_classification && ch_ampcombi_complete == null ) {
if (params.run_taxa_classification && ch_ampcombi_complete == null) {
log.warn("[nf-core/funcscan] No AMP hits were found in the samples, therefore no Taxonomy will be merged ")
} else if ( params.run_taxa_classification && ch_ampcombi_complete != null ) {
ch_mmseqs_taxonomy_list = tsvs.map{ it[1] }.collect()
}
else if (params.run_taxa_classification && ch_ampcombi_complete != null) {
ch_mmseqs_taxonomy_list = tsvs.map { it[1] }.collect()

MERGE_TAXONOMY_AMPCOMBI( AMPCOMBI2_CLUSTER.out.cluster_tsv, ch_mmseqs_taxonomy_list )
ch_versions = ch_versions.mix( MERGE_TAXONOMY_AMPCOMBI.out.versions )
MERGE_TAXONOMY_AMPCOMBI(AMPCOMBI2_CLUSTER.out.cluster_tsv, ch_mmseqs_taxonomy_list)
ch_versions = ch_versions.mix(MERGE_TAXONOMY_AMPCOMBI.out.versions)

ch_tabix_input = Channel.of( [ 'id':'ampcombi_complete_summary_taxonomy' ] )
.combine( MERGE_TAXONOMY_AMPCOMBI.out.tsv )
ch_tabix_input = channel.of(['id': 'ampcombi_complete_summary_taxonomy'])
.combine(MERGE_TAXONOMY_AMPCOMBI.out.tsv)

AMP_TABIX_BGZIP( ch_tabix_input )
ch_versions = ch_versions.mix( AMP_TABIX_BGZIP.out.versions )
AMP_TABIX_BGZIP(ch_tabix_input)
ch_versions = ch_versions.mix(AMP_TABIX_BGZIP.out.versions)
}

emit:
Expand Down
28 changes: 14 additions & 14 deletions subworkflows/local/annotation.nf
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,25 @@
Run annotation tools
*/

include { PROKKA } from '../../modules/nf-core/prokka/main'
include { PRODIGAL } from '../../modules/nf-core/prodigal/main'
include { PYRODIGAL } from '../../modules/nf-core/pyrodigal/main'
include { BAKTA_BAKTADBDOWNLOAD } from '../../modules/nf-core/bakta/baktadbdownload/main'
include { BAKTA_BAKTA } from '../../modules/nf-core/bakta/bakta/main'
include { GUNZIP as GUNZIP_PRODIGAL_FNA } from '../../modules/nf-core/gunzip/main'
include { GUNZIP as GUNZIP_PRODIGAL_FAA } from '../../modules/nf-core/gunzip/main'
include { GUNZIP as GUNZIP_PRODIGAL_GBK } from '../../modules/nf-core/gunzip/main'
include { GUNZIP as GUNZIP_PYRODIGAL_FNA } from '../../modules/nf-core/gunzip/main'
include { GUNZIP as GUNZIP_PYRODIGAL_FAA } from '../../modules/nf-core/gunzip/main'
include { GUNZIP as GUNZIP_PYRODIGAL_GBK } from '../../modules/nf-core/gunzip/main'
include { PROKKA } from '../../modules/nf-core/prokka'
include { PRODIGAL } from '../../modules/nf-core/prodigal'
include { PYRODIGAL } from '../../modules/nf-core/pyrodigal'
include { BAKTA_BAKTADBDOWNLOAD } from '../../modules/nf-core/bakta/baktadbdownload'
include { BAKTA_BAKTA } from '../../modules/nf-core/bakta/bakta'
include { GUNZIP as GUNZIP_PRODIGAL_FNA } from '../../modules/nf-core/gunzip'
include { GUNZIP as GUNZIP_PRODIGAL_FAA } from '../../modules/nf-core/gunzip'
include { GUNZIP as GUNZIP_PRODIGAL_GBK } from '../../modules/nf-core/gunzip'
include { GUNZIP as GUNZIP_PYRODIGAL_FNA } from '../../modules/nf-core/gunzip'
include { GUNZIP as GUNZIP_PYRODIGAL_FAA } from '../../modules/nf-core/gunzip'
include { GUNZIP as GUNZIP_PYRODIGAL_GBK } from '../../modules/nf-core/gunzip'

workflow ANNOTATION {
take:
fasta // tuple val(meta), path(contigs)

main:
ch_versions = Channel.empty()
ch_multiqc_files = Channel.empty()
ch_versions = channel.empty()
ch_multiqc_files = channel.empty()

if (params.annotation_tool == "pyrodigal" || (params.annotation_tool == "prodigal" && params.run_bgc_screening == true && (!params.bgc_skip_antismash || !params.bgc_skip_deepbgc || !params.bgc_skip_gecco)) || (params.annotation_tool == "prodigal" && params.run_amp_screening == true)) {
// Need to use Pyrodigal for most BGC tools and AMPcombi because Prodigal GBK annotation format is incompatible with them.
Expand Down Expand Up @@ -71,7 +71,7 @@ workflow ANNOTATION {

// BAKTA prepare download
if (params.annotation_bakta_db) {
ch_bakta_db = Channel.fromPath(params.annotation_bakta_db, checkIfExists: true)
ch_bakta_db = channel.fromPath(params.annotation_bakta_db, checkIfExists: true)
.first()
}
else {
Expand Down
Loading
Loading