kkonganti@0: // Define any required imports for this specific workflow kkonganti@0: import java.nio.file.Paths kkonganti@0: import nextflow.file.FileHelper kkonganti@0: kkonganti@0: // Include any necessary methods kkonganti@0: include { \ kkonganti@0: summaryOfParams; stopNow; fastqEntryPointHelp; sendMail; conciseHelp; \ kkonganti@0: addPadding; wrapUpHelp } from "${params.routines}" kkonganti@0: include { dpubmlstpyHelp } from "${params.toolshelp}${params.fs}dpubmlstpy" kkonganti@0: include { fastpHelp } from "${params.toolshelp}${params.fs}fastp" kkonganti@0: include { mashscreenHelp } from "${params.toolshelp}${params.fs}mashscreen" kkonganti@0: include { tuspyHelp } from "${params.toolshelp}${params.fs}tuspy" kkonganti@0: include { spadesHelp } from "${params.toolshelp}${params.fs}spades" kkonganti@0: include { shovillHelp } from "${params.toolshelp}${params.fs}shovill" kkonganti@0: include { polypolishHelp } from "${params.toolshelp}${params.fs}polypolish" kkonganti@0: include { mashtreeHelp } from "${params.toolshelp}${params.fs}mashtree" kkonganti@0: include { quastHelp } from "${params.toolshelp}${params.fs}quast" kkonganti@0: include { prodigalHelp } from "${params.toolshelp}${params.fs}prodigal" kkonganti@0: include { prokkaHelp } from "${params.toolshelp}${params.fs}prokka" kkonganti@0: include { pirateHelp } from "${params.toolshelp}${params.fs}pirate" kkonganti@0: include { mlstHelp } from "${params.toolshelp}${params.fs}mlst" kkonganti@0: include { abricateHelp } from "${params.toolshelp}${params.fs}abricate" kkonganti@0: kkonganti@0: // Exit if help requested before any subworkflows kkonganti@0: if (params.help) { kkonganti@0: log.info help() kkonganti@0: exit 0 kkonganti@0: } kkonganti@0: kkonganti@0: // Include any necessary modules and subworkflows kkonganti@0: include { PROCESS_FASTQ } from "${params.subworkflows}${params.fs}process_fastq" kkonganti@0: include { PRODKA } from "${params.subworkflows}${params.fs}prodka" kkonganti@0: include { DOWNLOAD_PUBMLST_SCHEME } from "${params.modules}${params.fs}download_pubmlst_scheme${params.fs}main" kkonganti@0: include { DOWNLOAD_REF_GENOME } from "${params.modules}${params.fs}download_ref_genome${params.fs}main" kkonganti@0: include { FASTP } from "${params.modules}${params.fs}fastp${params.fs}main" kkonganti@0: include { MASH_SCREEN } from "${params.modules}${params.fs}mash${params.fs}screen${params.fs}main" kkonganti@0: include { TOP_UNIQUE_SEROVARS } from "${params.modules}${params.fs}top_unique_serovars${params.fs}main" kkonganti@0: include { CAT_UNIQUE } from "${params.modules}${params.fs}cat${params.fs}unique${params.fs}main" kkonganti@0: include { SPADES_ASSEMBLE } from "${params.modules}${params.fs}spades${params.fs}assemble${params.fs}main" kkonganti@0: include { SHOVILL } from "${params.modules}${params.fs}shovill${params.fs}main" kkonganti@0: include { BWA_IDX_MEM } from "${params.modules}${params.fs}custom${params.fs}bwa_idx_mem${params.fs}main" kkonganti@0: include { POLYPOLISH } from "${params.modules}${params.fs}polypolish${params.fs}main" kkonganti@0: include { GUNC_RUN } from "${params.modules}${params.fs}gunc${params.fs}run${params.fs}main" kkonganti@0: include { QUAST } from "${params.modules}${params.fs}quast${params.fs}main" kkonganti@0: include { RMLST_POST } from "${params.modules}${params.fs}rmlst${params.fs}main" kkonganti@0: include { PIRATE } from "${params.modules}${params.fs}pirate${params.fs}main" kkonganti@0: include { MASHTREE } from "${params.modules}${params.fs}mashtree${params.fs}main" kkonganti@0: include { MLST } from "${params.modules}${params.fs}mlst${params.fs}main" kkonganti@0: include { ABRICATE_RUN } from "${params.modules}${params.fs}abricate${params.fs}run${params.fs}main" kkonganti@0: include { ABRICATE_SUMMARY } from "${params.modules}${params.fs}abricate${params.fs}summary${params.fs}main" kkonganti@0: include { TABLE_SUMMARY } from "${params.modules}${params.fs}cat${params.fs}tables${params.fs}main" kkonganti@0: include { DUMP_SOFTWARE_VERSIONS } from "${params.modules}${params.fs}custom${params.fs}dump_software_versions${params.fs}main" kkonganti@0: include { MULTIQC } from "${params.modules}${params.fs}multiqc${params.fs}main" kkonganti@0: kkonganti@0: /* kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: INPUTS AND ANY CHECKS FOR THE CRONOLOGY WORKFLOW kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: */ kkonganti@0: def spades_custom_hmm = (params.spades_hmm ? file ( "${params.spades_hmm}" ) : false) kkonganti@0: def reads_platform = 0 kkonganti@0: def abricate_dbs = [ 'ncbiamrplus', 'resfinder', 'megares', 'argannot' ] kkonganti@0: kkonganti@0: reads_platform += (params.input ? 1 : 0) kkonganti@0: kkonganti@0: if (spades_custom_hmm && !spades_custom_hmm.exists()) { kkonganti@0: stopNow("Please check if the following SPAdes' custom HMM directory\n" + kkonganti@0: "path is valid:\n${params.spades_hmm}\nCannot proceed further!") kkonganti@0: } kkonganti@0: kkonganti@0: if (reads_platform < 1 || reads_platform == 0) { kkonganti@0: stopNow("Please mention at least one absolute path to input folder which contains\n" + kkonganti@0: "FASTQ files sequenced using the --input option.\n" + kkonganti@0: "Ex: --input (Illumina or Generic short reads in FASTQ format)") kkonganti@0: } kkonganti@0: kkonganti@0: /* kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: RUN THE CRONOLOGY WORKFLOW kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: */ kkonganti@0: kkonganti@0: workflow CRONOLOGY { kkonganti@0: main: kkonganti@0: ch_mqc_custom_tbl = Channel.empty() kkonganti@0: ch_dummy = Channel.fromPath("${params.dummyfile}") kkonganti@0: ch_dummy2 = Channel.fromPath("${params.dummyfile2}") kkonganti@0: kkonganti@0: log.info summaryOfParams() kkonganti@0: kkonganti@0: PROCESS_FASTQ() kkonganti@0: kkonganti@0: PROCESS_FASTQ.out.versions kkonganti@0: .set { software_versions } kkonganti@0: kkonganti@0: PROCESS_FASTQ.out.processed_reads kkonganti@0: .map { meta, fastq -> kkonganti@0: meta.sequence_sketch = (params.mash_sketch ?: null) kkonganti@0: [meta, fastq] kkonganti@0: } kkonganti@0: .set { ch_processed_reads } kkonganti@0: kkonganti@0: DOWNLOAD_PUBMLST_SCHEME( params.dpubmlstpy_org ?: null ) kkonganti@0: kkonganti@0: DOWNLOAD_REF_GENOME( kkonganti@0: (params.ref_acc ? ['id': params.ref_acc] : null) kkonganti@0: ) kkonganti@0: kkonganti@0: FASTP( ch_processed_reads ) kkonganti@0: kkonganti@0: FASTP.out.passed_reads kkonganti@0: .set { ch_processed_reads } kkonganti@0: kkonganti@0: FASTP.out.json kkonganti@0: .map { meta, json -> [ json ] } kkonganti@0: .collect() kkonganti@0: .set { ch_multiqc } kkonganti@0: kkonganti@0: MASH_SCREEN( ch_processed_reads ) kkonganti@0: kkonganti@0: TOP_UNIQUE_SEROVARS( MASH_SCREEN.out.screened ) kkonganti@0: kkonganti@0: TOP_UNIQUE_SEROVARS.out.tsv kkonganti@0: .map { meta, tsv -> tsv } kkonganti@0: .collectFile( kkonganti@0: name: 'iTOL_metadata_w_dups.txt', kkonganti@0: keepHeader: true, kkonganti@0: skip: 4, kkonganti@0: sort: true kkonganti@0: ) kkonganti@0: .map { file -> kkonganti@0: def meta = [:] kkonganti@0: meta.id = 'Unique iTOL Metadata' kkonganti@0: meta.skip_header = 4 kkonganti@0: [meta, file] kkonganti@0: } kkonganti@0: .concat( kkonganti@0: TOP_UNIQUE_SEROVARS.out.popup kkonganti@0: .map { meta, popup -> popup } kkonganti@0: .collectFile( kkonganti@0: name: 'iTOL_2_NCBI_Pathogens_w_dups.txt', kkonganti@0: keepHeader: true, kkonganti@0: skip: 3, kkonganti@0: sort: true kkonganti@0: ) kkonganti@0: .map { file -> kkonganti@0: def meta = [:] kkonganti@0: meta.id = 'Unique iTOL Popup' kkonganti@0: meta.skip_header = 3 kkonganti@0: [meta, file] kkonganti@0: } kkonganti@0: ) kkonganti@0: .set { ch_uniq } kkonganti@0: kkonganti@0: TOP_UNIQUE_SEROVARS.out.accessions kkonganti@0: .map { meta, acc -> acc } kkonganti@0: .splitText() kkonganti@0: .collect() kkonganti@0: .flatten() kkonganti@0: .unique() kkonganti@0: .collectFile(name: 'tree_genomes.txt') kkonganti@0: .map { genomes -> [ [id: 'hitsTree'], genomes ]} kkonganti@0: .set { ch_genomes_fofn } kkonganti@0: kkonganti@0: CAT_UNIQUE( ch_uniq ) kkonganti@0: kkonganti@0: if (params.fq_single_end) { kkonganti@0: SPADES_ASSEMBLE( kkonganti@0: ch_processed_reads kkonganti@0: .combine(ch_dummy) kkonganti@0: .combine(ch_dummy2) kkonganti@0: ) kkonganti@0: kkonganti@0: SPADES_ASSEMBLE.out.assembly kkonganti@0: .set{ ch_assembly } kkonganti@0: kkonganti@0: software_versions kkonganti@0: .mix( SPADES_ASSEMBLE.out.versions.ifEmpty(null) ) kkonganti@0: .set { software_versions } kkonganti@0: } else { kkonganti@0: SHOVILL( ch_processed_reads ) kkonganti@0: kkonganti@0: SHOVILL.out.contigs kkonganti@0: .set { ch_assembly } kkonganti@0: kkonganti@0: software_versions kkonganti@0: .mix( SHOVILL.out.versions.ifEmpty(null) ) kkonganti@0: .set { software_versions } kkonganti@0: } kkonganti@0: kkonganti@0: if (params.polypolish_run) { kkonganti@0: BWA_IDX_MEM( kkonganti@0: ch_assembly kkonganti@0: .join( ch_processed_reads ) kkonganti@0: ) kkonganti@0: kkonganti@0: POLYPOLISH( kkonganti@0: ch_assembly kkonganti@0: .join( BWA_IDX_MEM.out.aligned_sam ) kkonganti@0: ) kkonganti@0: kkonganti@0: POLYPOLISH.out.polished kkonganti@0: .set { ch_assembly } kkonganti@0: kkonganti@0: software_versions kkonganti@0: .mix(POLYPOLISH.out.versions) kkonganti@0: } kkonganti@0: kkonganti@0: ch_assembly kkonganti@0: .combine( DOWNLOAD_REF_GENOME.out.fasta ) kkonganti@0: .combine( DOWNLOAD_REF_GENOME.out.gff ) kkonganti@0: .multiMap { meta, consensus, fasta, gff -> kkonganti@0: sample_fa: consensus kkonganti@0: polished: [meta, consensus] kkonganti@0: ref_fasta: [meta, fasta] kkonganti@0: ref_gff: [meta, gff] kkonganti@0: } kkonganti@0: .set { ch_quast } kkonganti@0: kkonganti@0: MASHTREE( kkonganti@0: ch_genomes_fofn, kkonganti@0: DOWNLOAD_REF_GENOME.out.fasta kkonganti@0: .concat( ch_quast.sample_fa ) kkonganti@0: .collect() kkonganti@0: ) kkonganti@0: kkonganti@0: PRODKA( kkonganti@0: ch_quast.ref_fasta, kkonganti@0: ch_quast.polished kkonganti@0: ) kkonganti@0: kkonganti@0: RMLST_POST( ch_assembly ) kkonganti@0: kkonganti@0: MLST ( kkonganti@0: ch_assembly kkonganti@0: .combine( DOWNLOAD_PUBMLST_SCHEME.out.pubmlst_dir ) kkonganti@0: ) kkonganti@0: kkonganti@0: QUAST( kkonganti@0: ch_quast.polished, kkonganti@0: ch_quast.ref_fasta, kkonganti@0: ch_quast.ref_gff kkonganti@0: ) kkonganti@0: kkonganti@0: if (params.pirate_run) { kkonganti@0: PIRATE( kkonganti@0: PRODKA.out.prokka_gff kkonganti@0: .map { meta, gff -> kkonganti@0: tuple( [id: 'Predicted Genes'], gff ) kkonganti@0: } kkonganti@0: .groupTuple(by: [0]) kkonganti@0: ) kkonganti@0: kkonganti@0: software_versions kkonganti@0: .mix(PIRATE.out.versions) kkonganti@0: } kkonganti@0: kkonganti@0: RMLST_POST.out.tsv kkonganti@0: .map { meta, tsv -> [ 'rmlst', tsv] } kkonganti@0: .groupTuple(by: [0]) kkonganti@0: .map { it -> tuple ( it[0], it[1].flatten() ) } kkonganti@0: .set { ch_mqc_rmlst_tbl } kkonganti@0: kkonganti@0: MLST.out.tsv kkonganti@0: .map { meta, tsv -> [ 'mlst', tsv] } kkonganti@0: .groupTuple(by: [0]) kkonganti@0: .map { it -> tuple ( it[0], it[1].flatten() ) } kkonganti@0: .set { ch_mqc_custom_tbl } kkonganti@0: kkonganti@0: ABRICATE_RUN ( ch_assembly, abricate_dbs ) kkonganti@0: kkonganti@0: ABRICATE_RUN.out.abricated kkonganti@0: .map { meta, abres -> [ abricate_dbs, abres ] } kkonganti@0: .groupTuple(by: [0]) kkonganti@0: .map { it -> tuple ( it[0], it[1].flatten() ) } kkonganti@0: .set { ch_abricated } kkonganti@0: kkonganti@0: ABRICATE_SUMMARY ( ch_abricated ) kkonganti@0: kkonganti@0: ch_mqc_custom_tbl kkonganti@0: .concat ( kkonganti@0: ch_mqc_rmlst_tbl, kkonganti@0: ABRICATE_SUMMARY.out.ncbiamrplus.map { it -> tuple ( it[0], it[1] )}, kkonganti@0: ABRICATE_SUMMARY.out.resfinder.map { it -> tuple ( it[0], it[1] )}, kkonganti@0: ABRICATE_SUMMARY.out.megares.map { it -> tuple ( it[0], it[1] )}, kkonganti@0: ABRICATE_SUMMARY.out.argannot.map { it -> tuple ( it[0], it[1] )}, kkonganti@0: ) kkonganti@0: .groupTuple(by: [0]) kkonganti@0: .map { it -> [ it[0], it[1].flatten() ]} kkonganti@0: .set { ch_mqc_custom_tbl } kkonganti@0: kkonganti@0: TABLE_SUMMARY ( ch_mqc_custom_tbl ) kkonganti@0: kkonganti@0: DUMP_SOFTWARE_VERSIONS ( kkonganti@0: software_versions kkonganti@0: .mix( kkonganti@0: DOWNLOAD_PUBMLST_SCHEME.out.versions, kkonganti@0: DOWNLOAD_REF_GENOME.out.versions, kkonganti@0: FASTP.out.versions, kkonganti@0: MASH_SCREEN.out.versions, kkonganti@0: TOP_UNIQUE_SEROVARS.out.versions, kkonganti@0: CAT_UNIQUE.out.versions, kkonganti@0: MASHTREE.out.versions, kkonganti@0: POLYPOLISH.out.versions, kkonganti@0: QUAST.out.versions, kkonganti@0: PRODKA.out.versions, kkonganti@0: RMLST_POST.out.versions, kkonganti@0: MLST.out.versions, kkonganti@0: ABRICATE_RUN.out.versions, kkonganti@0: ABRICATE_SUMMARY.out.versions, kkonganti@0: TABLE_SUMMARY.out.versions kkonganti@0: ) kkonganti@0: .unique() kkonganti@0: .collectFile(name: 'collected_versions.yml') kkonganti@0: ) kkonganti@0: kkonganti@0: DUMP_SOFTWARE_VERSIONS.out.mqc_yml kkonganti@0: .concat ( kkonganti@0: ch_multiqc, kkonganti@0: TABLE_SUMMARY.out.mqc_yml, kkonganti@0: PRODKA.out.prokka_txt.map { meta, txt -> txt }, kkonganti@0: QUAST.out.results.map { meta, res -> res } kkonganti@0: ) kkonganti@0: .collect() kkonganti@0: .set { ch_multiqc } kkonganti@0: kkonganti@0: MULTIQC( ch_multiqc ) kkonganti@0: } kkonganti@0: kkonganti@0: /* kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: ON COMPLETE, SHOW GORY DETAILS OF ALL PARAMS WHICH WILL BE HELPFUL TO DEBUG kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: */ kkonganti@0: kkonganti@0: workflow.onComplete { kkonganti@0: if (workflow.success) { kkonganti@0: sendMail() kkonganti@0: } kkonganti@0: } kkonganti@0: kkonganti@0: workflow.onError { kkonganti@0: sendMail() kkonganti@0: } kkonganti@0: kkonganti@0: /* kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: HELP TEXT METHODS FOR CRONOLOGY WORKFLOW kkonganti@0: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ kkonganti@0: */ kkonganti@0: kkonganti@0: def help() { kkonganti@0: kkonganti@0: Map helptext = [:] kkonganti@0: Map nH = [:] kkonganti@0: Map fastpAdapterHelp = [:] kkonganti@0: def uHelp = (params.help.getClass().toString() =~ /String/ ? params.help.tokenize(',').join(' ') : '') kkonganti@0: kkonganti@0: Map defaultHelp = [ kkonganti@0: '--help dpubmlstpy' : 'Show dl_pubmlst_profiles_and_schemes.py CLI options CLI options', kkonganti@0: '--help fastp' : 'Show fastp CLI options', kkonganti@0: '--help spades' : 'Show mash `screen` CLI options', kkonganti@0: '--help shovill' : 'Show shovill CLI options', kkonganti@0: '--help polypolish' : 'Show polypolish CLI options', kkonganti@0: '--help quast' : 'Show quast.py CLI options', kkonganti@0: '--help prodigal' : 'Show prodigal CLI options', kkonganti@0: '--help prokka' : 'Show prokka CLI options', kkonganti@0: '--help pirate' : 'Show priate CLI options', kkonganti@0: '--help mlst' : 'Show mlst CLI options', kkonganti@0: '--help mash' : 'Show mash `screen` CLI options', kkonganti@0: '--help tree' : 'Show mashtree CLI options', kkonganti@0: '--help abricate' : 'Show abricate CLI options\n' kkonganti@0: ] kkonganti@0: kkonganti@0: fastpAdapterHelp['--fastp_use_custom_adapaters'] = "Use custom adapter FASTA with fastp on top of " + kkonganti@0: "built-in adapter sequence auto-detection. Enabling this option will attempt to find and remove " + kkonganti@0: "all possible Illumina adapter and primer sequences but will make the workflow run slow. " + kkonganti@0: "Default: ${params.fastp_use_custom_adapters}" kkonganti@0: kkonganti@0: if (params.help.getClass().toString() =~ /Boolean/ || uHelp.size() == 0) { kkonganti@0: println conciseHelp('fastp,polypolish') kkonganti@0: helptext.putAll(defaultHelp) kkonganti@0: } else { kkonganti@0: params.help.tokenize(',').each { h -> kkonganti@0: if (defaultHelp.keySet().findAll{ it =~ /(?i)\b${h}\b/ }.size() == 0) { kkonganti@0: println conciseHelp('fastp,polypolish') kkonganti@0: stopNow("Tool [ ${h} ] is not a part of ${params.pipeline} pipeline.") kkonganti@0: } kkonganti@0: } kkonganti@0: kkonganti@0: helptext.putAll( kkonganti@0: fastqEntryPointHelp() + kkonganti@0: (uHelp =~ /(?i)\bdpubmlstpy/ ? dpubmlstpyHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bfastp/ ? fastpHelp(params).text + fastpAdapterHelp : nH) + kkonganti@0: (uHelp =~ /(?i)\bmash/ ? mashscreenHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\btuspy/ ? tuspyHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bspades/ ? spadesHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bshovill/ ? shovillHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bpolypolish/ ? polypolishHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bquast/ ? quastHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bprodigal/ ? prodigalHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bprokka/ ? prokkaHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bpirate/ ? pirateHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\bmlst/ ? mlstHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\btree/ ? mashtreeHelp(params).text : nH) + kkonganti@0: (uHelp =~ /(?i)\babricate/ ? abricateHelp(params).text : nH) + kkonganti@0: wrapUpHelp() kkonganti@0: ) kkonganti@0: } kkonganti@0: kkonganti@0: return addPadding(helptext) kkonganti@0: }