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 } |