comparison 0.1.0/workflows/cronology.nf @ 0:c8597e9e1a97

"planemo upload"
author kkonganti
date Mon, 27 Nov 2023 12:37:44 -0500
parents
children 5eaaf749472c
comparison
equal deleted inserted replaced
-1:000000000000 0:c8597e9e1a97
1 // Define any required imports for this specific workflow
2 import java.nio.file.Paths
3 import nextflow.file.FileHelper
4
5 // Include any necessary methods
6 include { \
7 summaryOfParams; stopNow; fastqEntryPointHelp; sendMail; conciseHelp; \
8 addPadding; wrapUpHelp } from "${params.routines}"
9 include { dpubmlstpyHelp } from "${params.toolshelp}${params.fs}dpubmlstpy"
10 include { fastpHelp } from "${params.toolshelp}${params.fs}fastp"
11 include { mashscreenHelp } from "${params.toolshelp}${params.fs}mashscreen"
12 include { tuspyHelp } from "${params.toolshelp}${params.fs}tuspy"
13 include { spadesHelp } from "${params.toolshelp}${params.fs}spades"
14 include { shovillHelp } from "${params.toolshelp}${params.fs}shovill"
15 include { polypolishHelp } from "${params.toolshelp}${params.fs}polypolish"
16 include { mashtreeHelp } from "${params.toolshelp}${params.fs}mashtree"
17 include { quastHelp } from "${params.toolshelp}${params.fs}quast"
18 include { prodigalHelp } from "${params.toolshelp}${params.fs}prodigal"
19 include { prokkaHelp } from "${params.toolshelp}${params.fs}prokka"
20 include { pirateHelp } from "${params.toolshelp}${params.fs}pirate"
21 include { mlstHelp } from "${params.toolshelp}${params.fs}mlst"
22 include { abricateHelp } from "${params.toolshelp}${params.fs}abricate"
23
24 // Exit if help requested before any subworkflows
25 if (params.help) {
26 log.info help()
27 exit 0
28 }
29
30 // Include any necessary modules and subworkflows
31 include { PROCESS_FASTQ } from "${params.subworkflows}${params.fs}process_fastq"
32 include { PRODKA } from "${params.subworkflows}${params.fs}prodka"
33 include { DOWNLOAD_PUBMLST_SCHEME } from "${params.modules}${params.fs}download_pubmlst_scheme${params.fs}main"
34 include { DOWNLOAD_REF_GENOME } from "${params.modules}${params.fs}download_ref_genome${params.fs}main"
35 include { FASTP } from "${params.modules}${params.fs}fastp${params.fs}main"
36 include { MASH_SCREEN } from "${params.modules}${params.fs}mash${params.fs}screen${params.fs}main"
37 include { TOP_UNIQUE_SEROVARS } from "${params.modules}${params.fs}top_unique_serovars${params.fs}main"
38 include { CAT_UNIQUE } from "${params.modules}${params.fs}cat${params.fs}unique${params.fs}main"
39 include { SPADES_ASSEMBLE } from "${params.modules}${params.fs}spades${params.fs}assemble${params.fs}main"
40 include { SHOVILL } from "${params.modules}${params.fs}shovill${params.fs}main"
41 include { BWA_IDX_MEM } from "${params.modules}${params.fs}custom${params.fs}bwa_idx_mem${params.fs}main"
42 include { POLYPOLISH } from "${params.modules}${params.fs}polypolish${params.fs}main"
43 include { GUNC_RUN } from "${params.modules}${params.fs}gunc${params.fs}run${params.fs}main"
44 include { QUAST } from "${params.modules}${params.fs}quast${params.fs}main"
45 include { RMLST_POST } from "${params.modules}${params.fs}rmlst${params.fs}main"
46 include { PIRATE } from "${params.modules}${params.fs}pirate${params.fs}main"
47 include { MASHTREE } from "${params.modules}${params.fs}mashtree${params.fs}main"
48 include { MLST } from "${params.modules}${params.fs}mlst${params.fs}main"
49 include { ABRICATE_RUN } from "${params.modules}${params.fs}abricate${params.fs}run${params.fs}main"
50 include { ABRICATE_SUMMARY } from "${params.modules}${params.fs}abricate${params.fs}summary${params.fs}main"
51 include { TABLE_SUMMARY } from "${params.modules}${params.fs}cat${params.fs}tables${params.fs}main"
52 include { DUMP_SOFTWARE_VERSIONS } from "${params.modules}${params.fs}custom${params.fs}dump_software_versions${params.fs}main"
53 include { MULTIQC } from "${params.modules}${params.fs}multiqc${params.fs}main"
54
55 /*
56 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
57 INPUTS AND ANY CHECKS FOR THE CRONOLOGY WORKFLOW
58 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
59 */
60 def spades_custom_hmm = (params.spades_hmm ? file ( "${params.spades_hmm}" ) : false)
61 def reads_platform = 0
62 def abricate_dbs = [ 'ncbiamrplus', 'resfinder', 'megares', 'argannot' ]
63
64 reads_platform += (params.input ? 1 : 0)
65
66 if (spades_custom_hmm && !spades_custom_hmm.exists()) {
67 stopNow("Please check if the following SPAdes' custom HMM directory\n" +
68 "path is valid:\n${params.spades_hmm}\nCannot proceed further!")
69 }
70
71 if (reads_platform < 1 || reads_platform == 0) {
72 stopNow("Please mention at least one absolute path to input folder which contains\n" +
73 "FASTQ files sequenced using the --input option.\n" +
74 "Ex: --input (Illumina or Generic short reads in FASTQ format)")
75 }
76
77 /*
78 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
79 RUN THE CRONOLOGY WORKFLOW
80 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
81 */
82
83 workflow CRONOLOGY {
84 main:
85 ch_mqc_custom_tbl = Channel.empty()
86 ch_dummy = Channel.fromPath("${params.dummyfile}")
87 ch_dummy2 = Channel.fromPath("${params.dummyfile2}")
88
89 log.info summaryOfParams()
90
91 PROCESS_FASTQ()
92
93 PROCESS_FASTQ.out.versions
94 .set { software_versions }
95
96 PROCESS_FASTQ.out.processed_reads
97 .map { meta, fastq ->
98 meta.sequence_sketch = (params.mash_sketch ?: null)
99 [meta, fastq]
100 }
101 .set { ch_processed_reads }
102
103 DOWNLOAD_PUBMLST_SCHEME( params.dpubmlstpy_org ?: null )
104
105 DOWNLOAD_REF_GENOME(
106 (params.ref_acc ? ['id': params.ref_acc] : null)
107 )
108
109 FASTP( ch_processed_reads )
110
111 FASTP.out.passed_reads
112 .set { ch_processed_reads }
113
114 FASTP.out.json
115 .map { meta, json -> [ json ] }
116 .collect()
117 .set { ch_multiqc }
118
119 MASH_SCREEN( ch_processed_reads )
120
121 TOP_UNIQUE_SEROVARS( MASH_SCREEN.out.screened )
122
123 TOP_UNIQUE_SEROVARS.out.tsv
124 .map { meta, tsv -> tsv }
125 .collectFile(
126 name: 'iTOL_metadata_w_dups.txt',
127 keepHeader: true,
128 skip: 4,
129 sort: true
130 )
131 .map { file ->
132 def meta = [:]
133 meta.id = 'Unique iTOL Metadata'
134 meta.skip_header = 4
135 [meta, file]
136 }
137 .concat(
138 TOP_UNIQUE_SEROVARS.out.popup
139 .map { meta, popup -> popup }
140 .collectFile(
141 name: 'iTOL_2_NCBI_Pathogens_w_dups.txt',
142 keepHeader: true,
143 skip: 3,
144 sort: true
145 )
146 .map { file ->
147 def meta = [:]
148 meta.id = 'Unique iTOL Popup'
149 meta.skip_header = 3
150 [meta, file]
151 }
152 )
153 .set { ch_uniq }
154
155 TOP_UNIQUE_SEROVARS.out.accessions
156 .map { meta, acc -> acc }
157 .splitText()
158 .collect()
159 .flatten()
160 .unique()
161 .collectFile(name: 'tree_genomes.txt')
162 .map { genomes -> [ [id: 'hitsTree'], genomes ]}
163 .set { ch_genomes_fofn }
164
165 CAT_UNIQUE( ch_uniq )
166
167 if (params.fq_single_end) {
168 SPADES_ASSEMBLE(
169 ch_processed_reads
170 .combine(ch_dummy)
171 .combine(ch_dummy2)
172 )
173
174 SPADES_ASSEMBLE.out.assembly
175 .set{ ch_assembly }
176
177 software_versions
178 .mix( SPADES_ASSEMBLE.out.versions.ifEmpty(null) )
179 .set { software_versions }
180 } else {
181 SHOVILL( ch_processed_reads )
182
183 SHOVILL.out.contigs
184 .set { ch_assembly }
185
186 software_versions
187 .mix( SHOVILL.out.versions.ifEmpty(null) )
188 .set { software_versions }
189 }
190
191 if (params.polypolish_run) {
192 BWA_IDX_MEM(
193 ch_assembly
194 .join( ch_processed_reads )
195 )
196
197 POLYPOLISH(
198 ch_assembly
199 .join( BWA_IDX_MEM.out.aligned_sam )
200 )
201
202 POLYPOLISH.out.polished
203 .set { ch_assembly }
204
205 software_versions
206 .mix(POLYPOLISH.out.versions)
207 }
208
209 ch_assembly
210 .combine( DOWNLOAD_REF_GENOME.out.fasta )
211 .combine( DOWNLOAD_REF_GENOME.out.gff )
212 .multiMap { meta, consensus, fasta, gff ->
213 sample_fa: consensus
214 polished: [meta, consensus]
215 ref_fasta: [meta, fasta]
216 ref_gff: [meta, gff]
217 }
218 .set { ch_quast }
219
220 MASHTREE(
221 ch_genomes_fofn,
222 DOWNLOAD_REF_GENOME.out.fasta
223 .concat( ch_quast.sample_fa )
224 .collect()
225 )
226
227 PRODKA(
228 ch_quast.ref_fasta,
229 ch_quast.polished
230 )
231
232 RMLST_POST( ch_assembly )
233
234 MLST (
235 ch_assembly
236 .combine( DOWNLOAD_PUBMLST_SCHEME.out.pubmlst_dir )
237 )
238
239 QUAST(
240 ch_quast.polished,
241 ch_quast.ref_fasta,
242 ch_quast.ref_gff
243 )
244
245 if (params.pirate_run) {
246 PIRATE(
247 PRODKA.out.prokka_gff
248 .map { meta, gff ->
249 tuple( [id: 'Predicted Genes'], gff )
250 }
251 .groupTuple(by: [0])
252 )
253
254 software_versions
255 .mix(PIRATE.out.versions)
256 }
257
258 RMLST_POST.out.tsv
259 .map { meta, tsv -> [ 'rmlst', tsv] }
260 .groupTuple(by: [0])
261 .map { it -> tuple ( it[0], it[1].flatten() ) }
262 .set { ch_mqc_rmlst_tbl }
263
264 MLST.out.tsv
265 .map { meta, tsv -> [ 'mlst', tsv] }
266 .groupTuple(by: [0])
267 .map { it -> tuple ( it[0], it[1].flatten() ) }
268 .set { ch_mqc_custom_tbl }
269
270 ABRICATE_RUN ( ch_assembly, abricate_dbs )
271
272 ABRICATE_RUN.out.abricated
273 .map { meta, abres -> [ abricate_dbs, abres ] }
274 .groupTuple(by: [0])
275 .map { it -> tuple ( it[0], it[1].flatten() ) }
276 .set { ch_abricated }
277
278 ABRICATE_SUMMARY ( ch_abricated )
279
280 ch_mqc_custom_tbl
281 .concat (
282 ch_mqc_rmlst_tbl,
283 ABRICATE_SUMMARY.out.ncbiamrplus.map { it -> tuple ( it[0], it[1] )},
284 ABRICATE_SUMMARY.out.resfinder.map { it -> tuple ( it[0], it[1] )},
285 ABRICATE_SUMMARY.out.megares.map { it -> tuple ( it[0], it[1] )},
286 ABRICATE_SUMMARY.out.argannot.map { it -> tuple ( it[0], it[1] )},
287 )
288 .groupTuple(by: [0])
289 .map { it -> [ it[0], it[1].flatten() ]}
290 .set { ch_mqc_custom_tbl }
291
292 TABLE_SUMMARY ( ch_mqc_custom_tbl )
293
294 DUMP_SOFTWARE_VERSIONS (
295 software_versions
296 .mix(
297 DOWNLOAD_PUBMLST_SCHEME.out.versions,
298 DOWNLOAD_REF_GENOME.out.versions,
299 FASTP.out.versions,
300 MASH_SCREEN.out.versions,
301 TOP_UNIQUE_SEROVARS.out.versions,
302 CAT_UNIQUE.out.versions,
303 MASHTREE.out.versions,
304 POLYPOLISH.out.versions,
305 QUAST.out.versions,
306 PRODKA.out.versions,
307 RMLST_POST.out.versions,
308 MLST.out.versions,
309 ABRICATE_RUN.out.versions,
310 ABRICATE_SUMMARY.out.versions,
311 TABLE_SUMMARY.out.versions
312 )
313 .unique()
314 .collectFile(name: 'collected_versions.yml')
315 )
316
317 DUMP_SOFTWARE_VERSIONS.out.mqc_yml
318 .concat (
319 ch_multiqc,
320 TABLE_SUMMARY.out.mqc_yml,
321 PRODKA.out.prokka_txt.map { meta, txt -> txt },
322 QUAST.out.results.map { meta, res -> res }
323 )
324 .collect()
325 .set { ch_multiqc }
326
327 MULTIQC( ch_multiqc )
328 }
329
330 /*
331 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
332 ON COMPLETE, SHOW GORY DETAILS OF ALL PARAMS WHICH WILL BE HELPFUL TO DEBUG
333 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
334 */
335
336 workflow.onComplete {
337 if (workflow.success) {
338 sendMail()
339 }
340 }
341
342 workflow.onError {
343 sendMail()
344 }
345
346 /*
347 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
348 HELP TEXT METHODS FOR CRONOLOGY WORKFLOW
349 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
350 */
351
352 def help() {
353
354 Map helptext = [:]
355 Map nH = [:]
356 Map fastpAdapterHelp = [:]
357 def uHelp = (params.help.getClass().toString() =~ /String/ ? params.help.tokenize(',').join(' ') : '')
358
359 Map defaultHelp = [
360 '--help dpubmlstpy' : 'Show dl_pubmlst_profiles_and_schemes.py CLI options CLI options',
361 '--help fastp' : 'Show fastp CLI options',
362 '--help spades' : 'Show mash `screen` CLI options',
363 '--help shovill' : 'Show shovill CLI options',
364 '--help polypolish' : 'Show polypolish CLI options',
365 '--help quast' : 'Show quast.py CLI options',
366 '--help prodigal' : 'Show prodigal CLI options',
367 '--help prokka' : 'Show prokka CLI options',
368 '--help pirate' : 'Show priate CLI options',
369 '--help mlst' : 'Show mlst CLI options',
370 '--help mash' : 'Show mash `screen` CLI options',
371 '--help tree' : 'Show mashtree CLI options',
372 '--help abricate' : 'Show abricate CLI options\n'
373 ]
374
375 fastpAdapterHelp['--fastp_use_custom_adapaters'] = "Use custom adapter FASTA with fastp on top of " +
376 "built-in adapter sequence auto-detection. Enabling this option will attempt to find and remove " +
377 "all possible Illumina adapter and primer sequences but will make the workflow run slow. " +
378 "Default: ${params.fastp_use_custom_adapters}"
379
380 if (params.help.getClass().toString() =~ /Boolean/ || uHelp.size() == 0) {
381 println conciseHelp('fastp,polypolish')
382 helptext.putAll(defaultHelp)
383 } else {
384 params.help.tokenize(',').each { h ->
385 if (defaultHelp.keySet().findAll{ it =~ /(?i)\b${h}\b/ }.size() == 0) {
386 println conciseHelp('fastp,polypolish')
387 stopNow("Tool [ ${h} ] is not a part of ${params.pipeline} pipeline.")
388 }
389 }
390
391 helptext.putAll(
392 fastqEntryPointHelp() +
393 (uHelp =~ /(?i)\bdpubmlstpy/ ? dpubmlstpyHelp(params).text : nH) +
394 (uHelp =~ /(?i)\bfastp/ ? fastpHelp(params).text + fastpAdapterHelp : nH) +
395 (uHelp =~ /(?i)\bmash/ ? mashscreenHelp(params).text : nH) +
396 (uHelp =~ /(?i)\btuspy/ ? tuspyHelp(params).text : nH) +
397 (uHelp =~ /(?i)\bspades/ ? spadesHelp(params).text : nH) +
398 (uHelp =~ /(?i)\bshovill/ ? shovillHelp(params).text : nH) +
399 (uHelp =~ /(?i)\bpolypolish/ ? polypolishHelp(params).text : nH) +
400 (uHelp =~ /(?i)\bquast/ ? quastHelp(params).text : nH) +
401 (uHelp =~ /(?i)\bprodigal/ ? prodigalHelp(params).text : nH) +
402 (uHelp =~ /(?i)\bprokka/ ? prokkaHelp(params).text : nH) +
403 (uHelp =~ /(?i)\bpirate/ ? pirateHelp(params).text : nH) +
404 (uHelp =~ /(?i)\bmlst/ ? mlstHelp(params).text : nH) +
405 (uHelp =~ /(?i)\btree/ ? mashtreeHelp(params).text : nH) +
406 (uHelp =~ /(?i)\babricate/ ? abricateHelp(params).text : nH) +
407 wrapUpHelp()
408 )
409 }
410
411 return addPadding(helptext)
412 }