Mercurial > repos > kkonganti > cfsan_cronology
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 } |