1version 1.0
2
3<#--- Store positional args in a WDL arg called "positionalArgs"--->
4<#assign positionalArgs="--positionalArgs"/>
5<#if beta?? && beta == true>
6# Run ${name} (**BETA**) (WDL auto generated from GATK Version ${version})
7<#elseif experimental?? && experimental == true>
8# Run ${name} **EXPERIMENTAL** ${name} (WDL auto generated from GATK Version ${version})
9<#else>
10# Run ${name} (WDL auto generated from GATK Version ${version})
11</#if>
12#
13# ${summary}
14#
15#  General Workflow (non-tool) Arguments
16#    ${"dockerImage"?right_pad(50)} Docker image for this workflow
17#    ${"gatk"?right_pad(50)} Location of gatk to run for this workflow
18#    ${"memoryRequirements"?right_pad(50)} Runtime memory requirements for this workflow
19#    ${"diskRequirements"?right_pad(50)} Runtime disk requirements for this workflow
20#    ${"cpuRequirements"?right_pad(50)} Runtime CPU count for this workflow
21#    ${"preemptibleRequirements"?right_pad(50)} Runtime preemptible count for this workflow
22#    ${"bootdisksizegbRequirements"?right_pad(50)} Runtime boot disk size for this workflow
23#
24<#if arguments.positional?size != 0>
25<@addArgumentDescriptions heading="Positional Tool Arguments" argsToUse=arguments.positional/>
26#
27</#if>
28<#if arguments.required?size != 0>
29<@addArgumentDescriptions heading="Required Tool Arguments" argsToUse=arguments.required/>
30#
31</#if>
32<#if arguments.optional?size != 0>
33<@addArgumentDescriptions heading="Optional Tool Arguments" argsToUse=arguments.optional/>
34#
35</#if>
36<#if arguments.common?size != 0>
37<@addArgumentDescriptions heading="Optional Common Arguments" argsToUse=arguments.common/>
38</#if>
39
40workflow ${name} {
41
42  input {
43    #Docker to use
44    String dockerImage
45    #App location
46    String gatk
47    #Memory to use
48    String memoryRequirements
49    #Disk requirements for this workflow
50    String diskRequirements
51    #CPU requirements for this workflow
52    String cpuRequirements
53    #Preemptible requirements for this workflow
54    String preemptibleRequirements
55    #Boot disk size requirements for this workflow
56    String bootdisksizegbRequirements
57    <@defineWorkflowInputs heading="Positional Arguments" argsToUse=arguments.positional/>
58    <@defineWorkflowInputs heading="Required Arguments" argsToUse=arguments.required/>
59    <@defineWorkflowInputs heading="Optional Tool Arguments" argsToUse=arguments.optional/>
60    <@defineWorkflowInputs heading="Optional Common Arguments" argsToUse=arguments.common/>
61
62  }
63
64  call ${name} {
65
66    input:
67
68        #Docker
69        ${"dockerImage"?right_pad(50)} = dockerImage,
70        #App location
71        ${"gatk"?right_pad(50)} = gatk,
72        #Memory to use
73        ${"memoryRequirements"?right_pad(50)} = memoryRequirements,
74        #Disk requirements for this workflow
75        ${"diskRequirements"?right_pad(50)} = diskRequirements,
76        #CPU requirements for this workflow
77        ${"cpuRequirements"?right_pad(50)} = cpuRequirements,
78        #Preemptible requirements for this workflow
79        ${"preemptibleRequirements"?right_pad(50)} = preemptibleRequirements,
80        #Boot disk size requirements for this workflow
81        ${"bootdisksizegbRequirements"?right_pad(50)} = bootdisksizegbRequirements,
82
83        <@callTaskInputs heading="Positional Arguments" argsToUse=arguments.positional/>
84        <@callTaskInputs heading="Required Arguments" argsToUse=arguments.required/>
85        <@callTaskInputs heading="Optional Tool Arguments" argsToUse=arguments.optional/>
86        <@callTaskInputs heading="Optional Common Arguments" argsToUse=arguments.common/>
87
88  }
89
90  output {
91    <@defineWorkflowOutputs heading="Workflow Outputs" outputs=runtimeOutputs/>
92  }
93
94  parameter_meta {
95    dockerImage: { description: "Docker image for this task" }
96    gatk: { description: "Location of gatk to run for this task" }
97    memoryRequirements: { description: "Runtime memory requirements for this task" }
98    diskRequirements: { description: "Runtime disk requirements for this task" }
99    cpuRequirements: { description: "Runtime CPU count for this task" }
100    preemptibleRequirements: { description: "Runtime preemptible count for this task" }
101    bootdisksizegbRequirements: { description: "Runtime boot disk size for this task" }
102    <@defineParamMeta heading="Positional Arguments" argsToUse=arguments.positional/>
103    <@defineParamMeta heading="Required Arguments" argsToUse=arguments.required/>
104    <@defineParamMeta heading="Optional Tool Arguments" argsToUse=arguments.optional/>
105    <@defineParamMeta heading="Optional Common Arguments" argsToUse=arguments.common/>
106  }
107}
108
109task ${name} {
110
111  input {
112    String dockerImage
113    String gatk
114    String memoryRequirements
115    String diskRequirements
116    String cpuRequirements
117    String preemptibleRequirements
118    String bootdisksizegbRequirements
119    <@defineTaskInputs heading="Positional Arguments" argsToUse=arguments.positional/>
120    <@defineTaskInputs heading="Required Arguments" argsToUse=arguments.required/>
121    <@defineTaskInputs heading="Optional Tool Arguments" argsToUse=arguments.optional/>
122    <@defineTaskInputs heading="Optional Common Arguments" argsToUse=arguments.common/>
123
124  }
125
126  command <<<
127    ~{gatk} ${name} \
128        <@callTaskCommand heading="Positional Arguments" argsToUse=arguments.positional/>
129        <@callTaskCommand heading="Required Arguments" argsToUse=arguments.required/>
130        <@callTaskCommand heading="Optional Tool Arguments" argsToUse=arguments.optional/>
131        <@callTaskCommand heading="Optional Common Arguments" argsToUse=arguments.common/>
132
133  >>>
134
135  <#if workflowProperties?? && workflowProperties?size != 0>
136  runtime {
137      docker: dockerImage
138      memory: memoryRequirements
139      disks: diskRequirements
140      cpu: cpuRequirements
141      preemptible: preemptibleRequirements
142      bootDiskSizeGb: bootdisksizegbRequirements
143  }
144  </#if>
145
146  output {
147    <@defineTaskOutputs heading="Task Outputs" outputs=runtimeOutputs/>
148  }
149
150  parameter_meta {
151    dockerImage: { description: "Docker image for this task" }
152    gatk: { description: "Location of gatk to run for this task" }
153    memoryRequirements: { description: "Runtime memory requirements for this task" }
154    diskRequirements: { description: "Runtime disk requirements for this task" }
155    cpuRequirements: { description: "Runtime CPU count for this task" }
156    preemptibleRequirements: { description: "Runtime preemptible count for this task" }
157    bootdisksizegbRequirements: { description: "Runtime boot disk size for this task" }
158    <@defineParamMeta heading="Positional Arguments" argsToUse=arguments.positional/>
159    <@defineParamMeta heading="Required Arguments" argsToUse=arguments.required/>
160    <@defineParamMeta heading="Optional Tool Arguments" argsToUse=arguments.optional/>
161    <@defineParamMeta heading="Optional Common Arguments" argsToUse=arguments.common/>
162  }
163}
164
165<#--------------------------------------->
166<#-- Macros -->
167
168<#macro addArgumentDescriptions heading argsToUse>
169    <#if argsToUse?size != 0>
170#  ${heading}
171        <#list argsToUse as arg>
172            <#if heading?starts_with("Positional")>
173#    ${positionalArgs?substring(2)?right_pad(50)} ${arg.summary?right_pad(60)[0..*80]}
174                <#if requiredCompanions?? && requiredCompanions[positionalArgs]??>
175                    <#list requiredCompanions[positionalArgs] as companion>
176#    ${companion.name?substring(2)?right_pad(50)} ${companion.summary?right_pad(60)[0..*80]}
177                    </#list>
178                </#if>
179                <#if optionalCompanions?? && optionalCompanions[positionalArgs]??>
180                    <#list optionalCompanions[positionalArgs] as companion>
181#    ${companion.name?substring(2)?right_pad(50)} Optional ${companion.summary?right_pad(60)[0..*80]}
182                    </#list>
183                </#if>
184            <#else>
185#    ${arg.name?substring(2)?right_pad(50)} ${arg.summary?right_pad(60)[0..*80]}
186                <#if requiredCompanions?? && requiredCompanions[arg.name]??>
187                    <#list requiredCompanions[arg.name] as companion>
188#    ${companion.name?substring(2)?right_pad(50)} ${companion.summary?right_pad(60)[0..*80]}
189                    </#list>
190                </#if>
191                <#if optionalCompanions?? && optionalCompanions[arg.name]??>
192                    <#list optionalCompanions[arg.name] as companion>
193#    ${companion.name?substring(2)?right_pad(50)} Optional ${companion.summary?right_pad(60)[0..*80]}
194                    </#list>
195                </#if>
196            </#if>
197        </#list>
198    </#if>
199</#macro>
200
201
202<#macro defineParamMeta heading argsToUse>
203    <#if argsToUse?size != 0>
204
205    # ${heading}
206        <#list argsToUse as arg>
207            <#if heading?starts_with("Positional")>
208                <#if localizationOptional?seq_contains(positionalArgs)>
209    ${positionalArgs?substring(2)}<#noparse>: {
210      description: "</#noparse>${arg.summary[0..*80]}<#noparse>",</#noparse>
211      localization_optional : true <#noparse>
212    }</#noparse>
213                <#else>
214    ${positionalArgs?substring(2)}<#noparse>: { description: "</#noparse>${arg.summary[0..*80]}<#noparse>" }</#noparse>
215                </#if>
216                <#if requiredCompanions?? && requiredCompanions[positionalArgs]??>
217                    <#list requiredCompanions[positionalArgs] as companion>
218                        <#if localizationOptional?seq_contains(positionalArgs)>
219    ${companion.name?substring(2)}<#noparse>: {
220      description: "</#noparse>${companion.summary[0..*80]}<#noparse>",</#noparse>
221      localization_optional : true <#noparse>
222    }</#noparse>
223                        <#else>
224    ${companion.name?substring(2)}<#noparse>: { description: "</#noparse>${companion.summary[0..*80]}<#noparse>" }</#noparse>
225                        </#if>
226                    </#list>
227                </#if>
228                <#if optionalCompanions?? && optionalCompanions[positionalArgs]??>
229                    <#list optionalCompanions[positionalArgs] as companion>
230                        <#if localizationOptional?seq_contains(positionalArgs)>
231    ${companion.name?substring(2)}<#noparse>: {
232      description: "</#noparse>${arg.summary[0..*80]}<#noparse>",</#noparse>
233      localization_optional : true <#noparse>
234    }</#noparse>
235                        <#else>
236    ${companion.name?substring(2)}<#noparse>: { description: "</#noparse>${companion.summary(60)[0..*80]}<#noparse>" }</#noparse>
237                        </#if>
238                    </#list>
239                </#if>
240            <#else>
241                <#if localizationOptional?seq_contains(arg.name)>
242    ${arg.name?substring(2)}<#noparse>: {
243      description: "</#noparse>${arg.summary[0..*80]}<#noparse>",</#noparse>
244      localization_optional : true <#noparse>
245    }</#noparse>
246                <#else>
247    ${arg.name?substring(2)}<#noparse>: { description: "</#noparse>${arg.summary[0..*80]}<#noparse>" }</#noparse>
248                </#if>
249                <#if requiredCompanions?? && requiredCompanions[arg.name]??>
250                    <#list requiredCompanions[arg.name] as companion>
251                        <#if localizationOptional?seq_contains(companion.name)>
252    ${companion.name?substring(2)}<#noparse>: {
253      description: "</#noparse>${companion.summary[0..*80]}<#noparse>",</#noparse>
254      localization_optional : true <#noparse>
255    }</#noparse>
256                        <#else>
257    ${companion.name?substring(2)}<#noparse>: { description: "</#noparse>${companion.summary[0..*80]}<#noparse>" }</#noparse>
258                        </#if>
259                    </#list>
260                </#if>
261                <#if optionalCompanions?? && optionalCompanions[arg.name]??>
262                    <#list optionalCompanions[arg.name] as companion>
263                        <#if localizationOptional?seq_contains(companion.name)>
264    ${companion.name?substring(2)}<#noparse>: {
265      description: "</#noparse>${companion.summary[0..*80]}<#noparse>",</#noparse>
266      localization_optional : true <#noparse>
267    }</#noparse>
268                        <#else>
269    ${companion.name?substring(2)}<#noparse>: { description: "</#noparse>${companion.summary[0..*80]}<#noparse>" }</#noparse>
270                        </#if>
271                    </#list>
272                </#if>
273            </#if>
274        </#list>
275    </#if>
276</#macro>
277
278<#macro defineWorkflowInputs heading argsToUse>
279    <#if argsToUse?size != 0>
280
281    # ${heading}
282        <#list argsToUse as arg>
283            <#if heading?starts_with("Positional")>
284    ${arg.wdlinputtype} ${positionalArgs?substring(2)}
285                <#if requiredCompanions?? && requiredCompanions[positionalArgs]??>
286                    <#list requiredCompanions[positionalArgs] as companion>
287    ${arg.wdlinputtype} ${companion.name?substring(2)}
288                    </#list>
289                </#if>
290                <#if optionalCompanions?? && optionalCompanions[positionalArgs]??>
291                    <#list optionalCompanions[positionalArgs] as companion>
292    ${arg.wdlinputtype}? ${companion.name?substring(2)}
293                    </#list>
294                </#if>
295            <#else>
296    ${arg.wdlinputtype}<#if !heading?starts_with("Required")>?</#if> ${arg.name?substring(2)}
297                <#if requiredCompanions?? && requiredCompanions[arg.name]??>
298                    <#list requiredCompanions[arg.name] as companion>
299    ${arg.wdlinputtype} ${companion.name?substring(2)}
300                    </#list>
301                </#if>
302                <#if optionalCompanions?? && optionalCompanions[arg.name]??>
303                    <#list optionalCompanions[arg.name] as companion>
304    ${arg.wdlinputtype}? ${companion.name?substring(2)}
305                    </#list>
306                </#if>
307            </#if>
308        </#list>
309    </#if>
310</#macro>
311
312<#macro callTaskInputs heading argsToUse>
313    <#if argsToUse?size != 0>
314
315        # ${heading}
316        <#list argsToUse as arg>
317            <#if heading?starts_with("Positional")>
318        ${positionalArgs?substring(2)?right_pad(50)} = ${positionalArgs?substring(2)},
319                <#if requiredCompanions?? && requiredCompanions[positionalArgs]??>
320                    <#list requiredCompanions[positionalArgs] as companion>
321        ${companion.name?substring(2)?right_pad(50)} = ${companion.name?substring(2)},
322                    </#list>
323                </#if>
324                <#if optionalCompanions?? && optionalCompanions[positionalArgs]??>
325                    <#list optionalCompanions[positionalArgs] as companion>
326        ${companion.name?substring(2)?right_pad(50)} = ${companion.name?substring(2)},
327                    </#list>
328                </#if>
329            <#else>
330        ${arg.name?substring(2)?right_pad(50)} = ${arg.name?substring(2)},
331                <#if requiredCompanions?? && requiredCompanions[arg.name]??>
332                    <#list requiredCompanions[arg.name] as companion>
333        ${companion.name?substring(2)?right_pad(50)} = ${companion.name?substring(2)},
334                    </#list>
335                </#if>
336                <#if optionalCompanions?? && optionalCompanions[arg.name]??>
337                    <#list optionalCompanions[arg.name] as companion>
338        ${companion.name?substring(2)?right_pad(50)} = ${companion.name?substring(2)},
339                    </#list>
340                </#if>
341            </#if>
342        </#list>
343    </#if>
344</#macro>
345
346<#macro defineTaskInputs heading argsToUse>
347    <#if argsToUse?size != 0>
348        <#list argsToUse as arg>
349            <#if heading?starts_with("Positional")>
350    ${arg.wdlinputtype} ${positionalArgs?substring(2)}
351                <#if requiredCompanions?? && requiredCompanions[arg.name]??>
352                    <#list requiredCompanions[positionalArgs] as companion>
353    ${arg.wdlinputtype} Positional_${companion.name?substring(2)}
354                    </#list>
355                </#if>
356                <#if optionalCompanions?? && optionalCompanions[arg.name]??>
357                    <#list optionalCompanions[positionalArgs] as companion>
358    ${arg.wdlinputtype}? Positional_${companion.name?substring(2)}
359                    </#list>
360                </#if>
361            <#else>
362    ${arg.wdlinputtype}<#if !heading?starts_with("Required")>?</#if> ${arg.name?substring(2)}
363                <#if requiredCompanions?? && requiredCompanions[arg.name]??>
364                    <#list requiredCompanions[arg.name] as companion>
365    ${arg.wdlinputtype} ${companion.name?substring(2)}
366                    </#list>
367                </#if>
368                <#if optionalCompanions?? && optionalCompanions[arg.name]??>
369                    <#list optionalCompanions[arg.name] as companion>
370    ${arg.wdlinputtype}? ${companion.name?substring(2)}
371                    </#list>
372                </#if>
373            </#if>
374        </#list>
375    </#if>
376</#macro>
377
378<#macro defineWorkflowOutputs heading outputs>
379    # ${heading?right_pad(50)}
380    <#if outputs?size == 0>
381    File ${name}results = ${name}.${name}_results
382    <#else>
383        <#list outputs?keys as key>
384            <#if requiredOutputs[key]??>
385    ${outputs[key]} ${name}${key?substring(2)} = ${name}.${name}_${key?substring(2)}
386            <#else>
387    ${outputs[key]}? ${name}${key?substring(2)} = ${name}.${name}_${key?substring(2)}
388            </#if>
389        </#list>
390    </#if>
391</#macro>
392
393<#macro defineTaskOutputs heading outputs>
394    # ${heading?right_pad(50)}
395    <#if outputs?size == 0>
396    File ${name}_results = stdout()
397    <#else>
398        <#list outputs?keys as key>
399            <#if requiredOutputs[key]??>
400    ${outputs[key]} ${name}_${key?substring(2)} = ${key?substring(2)}
401            <#else>
402    ${outputs[key]}? ${name}_${key?substring(2)} = ${key?substring(2)}
403            </#if>
404        </#list>
405    </#if>
406</#macro>
407
408<#macro callTaskCommand heading argsToUse>
409    <#if argsToUse?size != 0>
410        <#list argsToUse as arg>
411            <#if heading?starts_with("Positional")>
412    <#noparse>~{sep=' ' </#noparse>${positionalArgs?substring(2)}<#noparse>}</#noparse> \
413            <#elseif heading?starts_with("Required")>
414    ${arg.actualArgName} <#noparse>~{sep=' </#noparse>${arg.actualArgName} <#noparse>' </#noparse>${arg.name?substring(2)}<#noparse>}</#noparse> \
415            <#else>
416    <#noparse>~{true='</#noparse>${arg.actualArgName} <#noparse>' false='' defined(</#noparse>${arg.name?substring(2)}<#noparse>)}~{sep='</#noparse> ${arg.actualArgName} <#noparse>'</#noparse> ${arg.name?substring(2)}<#noparse>}</#noparse> \
417            </#if>
418        </#list>
419    </#if>
420</#macro>
421