annotate 0.4.2/workflows/centriflaken.nf @ 105:52045ea4679d

"planemo upload"
author kkonganti
date Thu, 27 Jun 2024 14:17:26 -0400
parents
children
rev   line source
kkonganti@105 1 // Define any required imports for this specific workflow
kkonganti@105 2 import java.nio.file.Paths
kkonganti@105 3 import nextflow.file.FileHelper
kkonganti@105 4
kkonganti@105 5 // Include any necessary methods
kkonganti@105 6 include { \
kkonganti@105 7 summaryOfParams; stopNow; fastqEntryPointHelp; sendMail; \
kkonganti@105 8 addPadding; wrapUpHelp } from "${params.routines}"
kkonganti@105 9 include { kraken2Help } from "${params.toolshelp}${params.fs}kraken2"
kkonganti@105 10 include { centrifugeHelp } from "${params.toolshelp}${params.fs}centrifuge"
kkonganti@105 11 include { flyeHelp } from "${params.toolshelp}${params.fs}flye"
kkonganti@105 12 include { serotypefinderHelp } from "${params.toolshelp}${params.fs}serotypefinder"
kkonganti@105 13 include { seqsero2Help } from "${params.toolshelp}${params.fs}seqsero2"
kkonganti@105 14 include { mlstHelp } from "${params.toolshelp}${params.fs}mlst"
kkonganti@105 15 include { abricateHelp } from "${params.toolshelp}${params.fs}abricate"
kkonganti@105 16
kkonganti@105 17 // Exit if help requested before any subworkflows
kkonganti@105 18 if (params.help) {
kkonganti@105 19 log.info help()
kkonganti@105 20 exit 0
kkonganti@105 21 }
kkonganti@105 22
kkonganti@105 23 // Include any necessary modules and subworkflows
kkonganti@105 24 include { PROCESS_FASTQ } from "${params.subworkflows}${params.fs}process_fastq"
kkonganti@105 25 include { FASTQC } from "${params.modules}${params.fs}fastqc${params.fs}main"
kkonganti@105 26 include { CENTRIFUGE_CLASSIFY } from "${params.modules}${params.fs}centrifuge${params.fs}classify${params.fs}main"
kkonganti@105 27 include { CENTRIFUGE_PROCESS } from "${params.modules}${params.fs}centrifuge${params.fs}process${params.fs}main"
kkonganti@105 28 include { SEQKIT_GREP } from "${params.modules}${params.fs}seqkit${params.fs}grep${params.fs}main"
kkonganti@105 29 include { FLYE_ASSEMBLE } from "${params.modules}${params.fs}flye${params.fs}assemble${params.fs}main"
kkonganti@105 30 include { KRAKEN2_CLASSIFY } from "${params.modules}${params.fs}kraken2${params.fs}classify${params.fs}main"
kkonganti@105 31 include { KRAKEN2_EXTRACT_CONTIGS } from "${params.modules}${params.fs}kraken2${params.fs}extract_contigs${params.fs}main"
kkonganti@105 32 include { SEROTYPEFINDER } from "${params.modules}${params.fs}serotypefinder${params.fs}main"
kkonganti@105 33 include { SEQSERO2 } from "${params.modules}${params.fs}seqsero2${params.fs}main"
kkonganti@105 34 include { MLST } from "${params.modules}${params.fs}mlst${params.fs}main"
kkonganti@105 35 include { ABRICATE_RUN } from "${params.modules}${params.fs}abricate${params.fs}run${params.fs}main"
kkonganti@105 36 include { ABRICATE_SUMMARY } from "${params.modules}${params.fs}abricate${params.fs}summary${params.fs}main"
kkonganti@105 37 include { TABLE_SUMMARY } from "${params.modules}${params.fs}cat${params.fs}tables${params.fs}main"
kkonganti@105 38 include { MULTIQC } from "${params.modules}${params.fs}multiqc${params.fs}main"
kkonganti@105 39 include { DUMP_SOFTWARE_VERSIONS } from "${params.modules}${params.fs}custom${params.fs}dump_software_versions${params.fs}main"
kkonganti@105 40
kkonganti@105 41
kkonganti@105 42
kkonganti@105 43 /*
kkonganti@105 44 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 45 INPUTS AND ANY CHECKS FOR THE CENTRIFLAKEN WORKFLOW
kkonganti@105 46 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 47 */
kkonganti@105 48
kkonganti@105 49 def kraken2_db_dir = file ( "${params.kraken2_db}" )
kkonganti@105 50 def centrifuge_x = file ( "${params.centrifuge_x}" )
kkonganti@105 51 def reads_platform = 0
kkonganti@105 52 def abricate_dbs = [ 'ncbiamrplus', 'resfinder', 'megares', 'argannot' ]
kkonganti@105 53
kkonganti@105 54 reads_platform += (params.flye_nano_raw ? 1 : 0)
kkonganti@105 55 reads_platform += (params.flye_nano_corr ? 1 : 0)
kkonganti@105 56 reads_platform += (params.flye_nano_hq ? 1 : 0)
kkonganti@105 57 reads_platform += (params.flye_pacbio_raw ? 1 : 0)
kkonganti@105 58 reads_platform += (params.flye_pacbio_corr ? 1 : 0)
kkonganti@105 59 reads_platform += (params.flye_pacbio_hifi ? 1 : 0)
kkonganti@105 60
kkonganti@105 61 if (!kraken2_db_dir.exists() || !centrifuge_x.getParent().exists()) {
kkonganti@105 62 stopNow("Please check if the following absolute paths are valid:\n" +
kkonganti@105 63 "${params.kraken2_db}\n${params.centrifuge_x}\n" +
kkonganti@105 64 "Cannot proceed further!")
kkonganti@105 65 }
kkonganti@105 66
kkonganti@105 67 if (reads_platform > 1 || reads_platform == 0) {
kkonganti@105 68 msg_0 = (reads_platform > 1 ? "only" : "at least")
kkonganti@105 69 stopNow("Please mention ${msg_0} one read platform for use with the flye assembler\n" +
kkonganti@105 70 "using any one of the following options:\n" +
kkonganti@105 71 "--flye_nano_raw\n--flye_nano_corr\n--flye_nano_hq\n" +
kkonganti@105 72 "--flye_pacbio_raw\n--flye_pacbio_corr\n--flye_pacbio_hifi")
kkonganti@105 73 }
kkonganti@105 74
kkonganti@105 75 if (params.centrifuge_extract_bug != params.kraken2_extract_bug) {
kkonganti@105 76 stopNow("Please make sure that the bug to be extracted is same\n" +
kkonganti@105 77 "for both --centrifuge_extract_bug and --kraken2_extract_bug options.")
kkonganti@105 78 }
kkonganti@105 79
kkonganti@105 80 /*
kkonganti@105 81 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 82 RUN THE CENTRIFLAKEN WORKFLOW
kkonganti@105 83 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 84 */
kkonganti@105 85
kkonganti@105 86 workflow CENTRIFLAKEN {
kkonganti@105 87 main:
kkonganti@105 88 ch_asm_filtered_contigs = Channel.empty()
kkonganti@105 89 ch_mqc_custom_tbl = Channel.empty()
kkonganti@105 90
kkonganti@105 91 log.info summaryOfParams()
kkonganti@105 92
kkonganti@105 93 PROCESS_FASTQ()
kkonganti@105 94 .processed_reads
kkonganti@105 95 .map {
kkonganti@105 96 meta, fastq ->
kkonganti@105 97 meta.centrifuge_x = params.centrifuge_x
kkonganti@105 98 meta.kraken2_db = params.kraken2_db
kkonganti@105 99 [meta, fastq]
kkonganti@105 100 }
kkonganti@105 101 .set { ch_processed_reads }
kkonganti@105 102
kkonganti@105 103 PROCESS_FASTQ
kkonganti@105 104 .out
kkonganti@105 105 .versions
kkonganti@105 106 .set { software_versions }
kkonganti@105 107
kkonganti@105 108 FASTQC ( ch_processed_reads )
kkonganti@105 109
kkonganti@105 110 CENTRIFUGE_CLASSIFY ( ch_processed_reads )
kkonganti@105 111
kkonganti@105 112 CENTRIFUGE_PROCESS (
kkonganti@105 113 CENTRIFUGE_CLASSIFY.out.report
kkonganti@105 114 .join( CENTRIFUGE_CLASSIFY.out.output )
kkonganti@105 115 )
kkonganti@105 116
kkonganti@105 117 ch_processed_reads.join ( CENTRIFUGE_PROCESS.out.extracted )
kkonganti@105 118 .set { ch_centrifuge_extracted }
kkonganti@105 119
kkonganti@105 120 SEQKIT_GREP ( ch_centrifuge_extracted )
kkonganti@105 121
kkonganti@105 122 FLYE_ASSEMBLE ( SEQKIT_GREP.out.fastx )
kkonganti@105 123
kkonganti@105 124 FLYE_ASSEMBLE
kkonganti@105 125 .out
kkonganti@105 126 .assembly
kkonganti@105 127 .set { ch_flye_assembly }
kkonganti@105 128
kkonganti@105 129 ch_flye_assembly
kkonganti@105 130 .map {
kkonganti@105 131 meta, fastq ->
kkonganti@105 132 meta.is_assembly = true
kkonganti@105 133 [meta, fastq]
kkonganti@105 134 }
kkonganti@105 135 .set { ch_flye_assembly }
kkonganti@105 136
kkonganti@105 137 ch_flye_assembly.ifEmpty { [ false, false ] }
kkonganti@105 138
kkonganti@105 139 KRAKEN2_CLASSIFY ( ch_flye_assembly )
kkonganti@105 140
kkonganti@105 141 KRAKEN2_EXTRACT_CONTIGS (
kkonganti@105 142 ch_flye_assembly
kkonganti@105 143 .join( KRAKEN2_CLASSIFY.out.kraken_output ),
kkonganti@105 144 params.kraken2_extract_bug
kkonganti@105 145 )
kkonganti@105 146
kkonganti@105 147 KRAKEN2_EXTRACT_CONTIGS
kkonganti@105 148 .out
kkonganti@105 149 .asm_filtered_contigs
kkonganti@105 150 .map {
kkonganti@105 151 meta, fastq ->
kkonganti@105 152 meta.organism = params.kraken2_extract_bug.split(/\s+/)[0].capitalize()
kkonganti@105 153 meta.serotypefinder_db = params.serotypefinder_db
kkonganti@105 154 [meta, fastq]
kkonganti@105 155 }
kkonganti@105 156 .set { ch_asm_filtered_contigs }
kkonganti@105 157
kkonganti@105 158 SEROTYPEFINDER ( ch_asm_filtered_contigs )
kkonganti@105 159
kkonganti@105 160 SEQSERO2 ( ch_asm_filtered_contigs )
kkonganti@105 161
kkonganti@105 162 MLST ( ch_asm_filtered_contigs )
kkonganti@105 163
kkonganti@105 164 ABRICATE_RUN (
kkonganti@105 165 ch_asm_filtered_contigs,
kkonganti@105 166 abricate_dbs
kkonganti@105 167 )
kkonganti@105 168
kkonganti@105 169 ABRICATE_RUN
kkonganti@105 170 .out
kkonganti@105 171 .abricated
kkonganti@105 172 .map { meta, abres -> [ abricate_dbs, abres ] }
kkonganti@105 173 .groupTuple(by: [0])
kkonganti@105 174 .map { it -> tuple ( it[0], it[1].flatten() ) }
kkonganti@105 175 .set { ch_abricated }
kkonganti@105 176
kkonganti@105 177 ABRICATE_SUMMARY ( ch_abricated )
kkonganti@105 178
kkonganti@105 179 // ABRICATE_SUMMARY.out.ecoli_vf.set { ch_abricate_summary_ecoli_vf }
kkonganti@105 180 // ch_abricate_summary_ecoli_vf.ifEmpty { [ false, false ] }
kkonganti@105 181
kkonganti@105 182 CENTRIFUGE_CLASSIFY.out.kreport
kkonganti@105 183 .map { meta, kreport -> [ kreport ] }
kkonganti@105 184 .flatten()
kkonganti@105 185 .concat (
kkonganti@105 186 KRAKEN2_CLASSIFY.out.kraken_report
kkonganti@105 187 .map { meta, kreport -> [ kreport ] }
kkonganti@105 188 .flatten(),
kkonganti@105 189 FASTQC.out.zip
kkonganti@105 190 .map { meta, zip -> [ zip ] }
kkonganti@105 191 .flatten()
kkonganti@105 192 )
kkonganti@105 193 .set { ch_mqc_classify }
kkonganti@105 194
kkonganti@105 195 if (params.serotypefinder_run) {
kkonganti@105 196 SEROTYPEFINDER
kkonganti@105 197 .out
kkonganti@105 198 .serotyped
kkonganti@105 199 .map { meta, tsv -> [ 'serotypefinder', tsv ] }
kkonganti@105 200 .groupTuple(by: [0])
kkonganti@105 201 .map { it -> tuple ( it[0], it[1].flatten() ) }
kkonganti@105 202 .set { ch_mqc_custom_tbl }
kkonganti@105 203 } else if (params.seqsero2_run) {
kkonganti@105 204 SEQSERO2
kkonganti@105 205 .out
kkonganti@105 206 .serotyped
kkonganti@105 207 .map { meta, tsv -> [ 'seqsero2', tsv ] }
kkonganti@105 208 .groupTuple(by: [0])
kkonganti@105 209 .map { it -> tuple ( it[0], it[1].flatten() ) }
kkonganti@105 210 .set { ch_mqc_custom_tbl }
kkonganti@105 211 }
kkonganti@105 212
kkonganti@105 213 ch_mqc_custom_tbl
kkonganti@105 214 .concat (
kkonganti@105 215 ABRICATE_SUMMARY.out.ncbiamrplus.map{ it -> tuple ( it[0], it[1] )},
kkonganti@105 216 ABRICATE_SUMMARY.out.resfinder.map{ it -> tuple ( it[0], it[1] )},
kkonganti@105 217 ABRICATE_SUMMARY.out.megares.map{ it -> tuple ( it[0], it[1] )},
kkonganti@105 218 ABRICATE_SUMMARY.out.argannot.map{ it -> tuple ( it[0], it[1] )},
kkonganti@105 219 )
kkonganti@105 220 .groupTuple(by: [0])
kkonganti@105 221 .map { it -> [ it[0], it[1].flatten() ]}
kkonganti@105 222 .set { ch_mqc_custom_tbl }
kkonganti@105 223
kkonganti@105 224 TABLE_SUMMARY ( ch_mqc_custom_tbl )
kkonganti@105 225
kkonganti@105 226 DUMP_SOFTWARE_VERSIONS (
kkonganti@105 227 software_versions
kkonganti@105 228 .mix (
kkonganti@105 229 FASTQC.out.versions,
kkonganti@105 230 CENTRIFUGE_CLASSIFY.out.versions,
kkonganti@105 231 CENTRIFUGE_PROCESS.out.versions,
kkonganti@105 232 SEQKIT_GREP.out.versions,
kkonganti@105 233 FLYE_ASSEMBLE.out.versions.ifEmpty(null),
kkonganti@105 234 KRAKEN2_CLASSIFY.out.versions.ifEmpty(null),
kkonganti@105 235 KRAKEN2_EXTRACT_CONTIGS.out.versions.ifEmpty(null),
kkonganti@105 236 SEROTYPEFINDER.out.versions.ifEmpty(null),
kkonganti@105 237 SEQSERO2.out.versions.ifEmpty(null),
kkonganti@105 238 MLST.out.versions.ifEmpty(null),
kkonganti@105 239 ABRICATE_RUN.out.versions.ifEmpty(null),
kkonganti@105 240 ABRICATE_SUMMARY.out.versions.ifEmpty(null),
kkonganti@105 241 TABLE_SUMMARY.out.versions.ifEmpty(null)
kkonganti@105 242 )
kkonganti@105 243 .unique()
kkonganti@105 244 .collectFile(name: 'collected_versions.yml')
kkonganti@105 245 )
kkonganti@105 246
kkonganti@105 247 DUMP_SOFTWARE_VERSIONS
kkonganti@105 248 .out
kkonganti@105 249 .mqc_yml
kkonganti@105 250 .concat (
kkonganti@105 251 ch_mqc_classify,
kkonganti@105 252 TABLE_SUMMARY.out.mqc_yml
kkonganti@105 253 )
kkonganti@105 254 .collect()
kkonganti@105 255 .set { ch_multiqc }
kkonganti@105 256
kkonganti@105 257 MULTIQC ( ch_multiqc )
kkonganti@105 258 }
kkonganti@105 259
kkonganti@105 260 /*
kkonganti@105 261 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 262 ON COMPLETE, SHOW GORY DETAILS OF ALL PARAMS WHICH WILL BE HELPFUL TO DEBUG
kkonganti@105 263 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 264 */
kkonganti@105 265
kkonganti@105 266 workflow.onComplete {
kkonganti@105 267 if (workflow.success) {
kkonganti@105 268 // CREATE APPROPRIATE DIRECTORIES AND MOVE AS REQUESTED BY STAKEHOLDER(S)
kkonganti@105 269 //
kkonganti@105 270 // Nextflow's .moveTo will error out if directories contain files and it
kkonganti@105 271 // would be complex to include logic to skip directories
kkonganti@105 272 //
kkonganti@105 273 def final_intermediate_dir = "${params.output}${params.fs}${params.pipeline}-steps"
kkonganti@105 274 def final_results_dir = "${params.output}${params.fs}${params.pipeline}-results"
kkonganti@105 275 def kraken2_ext_contigs = file( "${final_intermediate_dir}${params.fs}kraken2_extract_contigs", type: 'dir' )
kkonganti@105 276 def final_intermediate = file( final_intermediate_dir, type: 'dir' )
kkonganti@105 277 def final_results = file( final_results_dir, type: 'dir' )
kkonganti@105 278 def pipeline_output = file( params.output, type: 'dir' )
kkonganti@105 279
kkonganti@105 280 if ( !final_intermediate.exists() ) {
kkonganti@105 281 final_intermediate.mkdirs()
kkonganti@105 282
kkonganti@105 283 FileHelper.visitFiles(Paths.get("${params.output}"), '*') {
kkonganti@105 284 if ( !(it.name ==~ /^(${params.cfsanpipename}|multiqc|\.nextflow|${workflow.workDir.name}|${params.pipeline}).*/) ) {
kkonganti@105 285 FileHelper.movePath(
kkonganti@105 286 it, Paths.get( "${final_intermediate_dir}${params.fs}${it.name}" )
kkonganti@105 287 )
kkonganti@105 288 }
kkonganti@105 289 }
kkonganti@105 290 }
kkonganti@105 291
kkonganti@105 292 if ( kraken2_ext_contigs.exists() && !final_results.exists() ) {
kkonganti@105 293 final_results.mkdirs()
kkonganti@105 294
kkonganti@105 295 FileHelper.movePath(
kkonganti@105 296 Paths.get( "${final_intermediate_dir}${params.fs}kraken2_extract_contigs" ),
kkonganti@105 297 Paths.get( "${final_results_dir}${params.fs}kraken2_extract_contigs" )
kkonganti@105 298 )
kkonganti@105 299 }
kkonganti@105 300
kkonganti@105 301 sendMail()
kkonganti@105 302 }
kkonganti@105 303 }
kkonganti@105 304
kkonganti@105 305 workflow.onError {
kkonganti@105 306 sendMail()
kkonganti@105 307 }
kkonganti@105 308
kkonganti@105 309 /*
kkonganti@105 310 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 311 HELPER METHODS FOR CENTRIFLAKEN WORKFLOW
kkonganti@105 312 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
kkonganti@105 313 */
kkonganti@105 314
kkonganti@105 315 def help() {
kkonganti@105 316
kkonganti@105 317 Map helptext = [:]
kkonganti@105 318
kkonganti@105 319 helptext.putAll (
kkonganti@105 320 fastqEntryPointHelp() +
kkonganti@105 321 kraken2Help(params).text +
kkonganti@105 322 centrifugeHelp(params).text +
kkonganti@105 323 flyeHelp(params).text +
kkonganti@105 324 serotypefinderHelp(params).text +
kkonganti@105 325 seqsero2Help(params).text +
kkonganti@105 326 mlstHelp(params).text +
kkonganti@105 327 abricateHelp(params).text +
kkonganti@105 328 wrapUpHelp()
kkonganti@105 329 )
kkonganti@105 330
kkonganti@105 331 return addPadding(helptext)
kkonganti@105 332 }