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