diff --git a/modules/nextflow/psltools/convert/main.nf b/modules/nextflow/psltools/convert/main.nf new file mode 100644 index 0000000..2b0a499 --- /dev/null +++ b/modules/nextflow/psltools/convert/main.nf @@ -0,0 +1,62 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_CONVERT — Convert PSL to BED +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_CONVERT { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psl) + + output: + tuple val(meta), path("*.bed") , optional: true, emit: bed + tuple val(meta), path("*.bed.gz") , optional: true, emit: bed_gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def type = task.ext.type ?: '12' + def gzip = task.ext.gzip ? "--gzip" : "" + """ + psltools convert \\ + $args \\ + $gzip \\ + --psl $psl \\ + --out ${prefix}.bed \\ + --type $type + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.bed + touch ${prefix}.bed.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/nextflow/psltools/filter/main.nf b/modules/nextflow/psltools/filter/main.nf new file mode 100644 index 0000000..c9b4343 --- /dev/null +++ b/modules/nextflow/psltools/filter/main.nf @@ -0,0 +1,58 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_FILTER — Filter PSL files by score, strand, or other criteria. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_FILTER { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psl) + + output: + tuple val(meta), path("*.psl") , optional: true, emit: psl + tuple val(meta), path("*.psl.gz") , optional: true, emit: psl_gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + psltools filter \\ + $args \\ + --psl $psl \\ + --out-psl ${prefix}.filtered.psl + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.psl + touch ${prefix}.psl.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/nextflow/psltools/merge/main.nf b/modules/nextflow/psltools/merge/main.nf new file mode 100644 index 0000000..f9ff5f7 --- /dev/null +++ b/modules/nextflow/psltools/merge/main.nf @@ -0,0 +1,60 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_MERGE — Merge PSL files into a single PSL file. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_MERGE { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psls) + + output: + tuple val(meta), path("*.psl") , optional: true, emit: psl + tuple val(meta), path("*.psl.gz") , optional: true, emit: psl_gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + ls *.psl > psl.list + + psltools merge \\ + $args \\ + --file psl.list \\ + --out-psl ${prefix}.merged.psl + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.merged.psl + touch ${prefix}.merged.psl.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/nextflow/psltools/score/main.nf b/modules/nextflow/psltools/score/main.nf new file mode 100644 index 0000000..65bc7df --- /dev/null +++ b/modules/nextflow/psltools/score/main.nf @@ -0,0 +1,58 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_SCORE — Score PSL files by summing the values of the alignment scores. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_SCORE { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psl) + + output: + tuple val(meta), path("*.tsv") , optional: true, emit: tsv + tuple val(meta), path("*.tsv.gz") , optional: true, emit: tsv_gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + psltools score \\ + $args \\ + --psl $psl \\ + --out ${prefix}.scores.tsv + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.tsv + touch ${prefix}.tsv.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/nextflow/psltools/sort/main.nf b/modules/nextflow/psltools/sort/main.nf new file mode 100644 index 0000000..ecde3e2 --- /dev/null +++ b/modules/nextflow/psltools/sort/main.nf @@ -0,0 +1,58 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_SORT — Sort PSL files by chromosome, start, or other criteria. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_SORT { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psl) + + output: + tuple val(meta), path("*.psl") , optional: true, emit: psl + tuple val(meta), path("*.psl.gz") , optional: true, emit: psl_gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + psltools sort \\ + $args \\ + --psl $psl \\ + --out ${prefix}.scores.psl + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.psl + touch ${prefix}.psl.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/nextflow/psltools/split/main.nf b/modules/nextflow/psltools/split/main.nf new file mode 100644 index 0000000..f0e2cdd --- /dev/null +++ b/modules/nextflow/psltools/split/main.nf @@ -0,0 +1,58 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_SPLIT — Split PSL files into multiple PSL files. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_SPLIT { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psl) + + output: + tuple val(meta), path("*.psl") , optional: true, emit: psl + tuple val(meta), path("*.psl.gz") , optional: true, emit: psl_gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + """ + psltools split \\ + $args \\ + --psl $psl \\ + --out-prefix ${prefix} + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.psl + touch ${prefix}.psl.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/nextflow/psltools/stats/main.nf b/modules/nextflow/psltools/stats/main.nf new file mode 100644 index 0000000..5bf896e --- /dev/null +++ b/modules/nextflow/psltools/stats/main.nf @@ -0,0 +1,59 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_STATS — Get statistics about PSL files. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_STATS { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psl) + + output: + tuple val(meta), path("*.json") , optional: true, emit: json + tuple val(meta), path("*.tsv") , optional: true, emit: tsv + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--json") ? ".json" : ".tsv" + """ + psltools stats \\ + $args \\ + --psl $psl \\ + > ${prefix}.stats$extension + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.stats.tsv + touch ${prefix}.stats.json + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/nextflow/psltools/swap/main.nf b/modules/nextflow/psltools/swap/main.nf new file mode 100644 index 0000000..0ea72d2 --- /dev/null +++ b/modules/nextflow/psltools/swap/main.nf @@ -0,0 +1,59 @@ +/* +Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +Distributed under the terms of the Apache License, Version 2.0. +*/ + +/* +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + PSLTOOLS_SWAP — Swap PSL files from reference to query. +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +*/ + +process PSLTOOLS_SWAP { + tag "$meta.id" + label 'process_low' + + conda "${moduleDir}/environment.yml" + container "${ workflow.containerEngine == 'singularity' && !task.ext.singularity_pull_docker_container ? + '' : + 'ghcr.io/alejandrogzi/psltools:latest' }" + + input: + tuple val(meta), path(psl) + + output: + tuple val(meta), path("*.psl") , optional: true, emit: psl + tuple val(meta), path("*.psl.gz") , optional: true, emit: psl_gz + path "versions.yml" , emit: versions + + when: + task.ext.when == null || task.ext.when + + script: + def args = task.ext.args ?: '' + def prefix = task.ext.prefix ?: "${meta.id}" + def extension = args.contains("--json") ? ".json" : ".tsv" + """ + psltools stats \\ + $args \\ + --psl $psl \\ + --out-psl ${prefix}.swapped.psl + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ + + stub: + def prefix = task.ext.prefix ?: "${meta.id}" + """ + touch ${prefix}.swapped.psl + touch ${prefix}.swapped.psl.gz + + cat <<-END_VERSIONS > versions.yml + "${task.process}": + psltools: \$( psltools --version | sed 's/psltools //g' ) + END_VERSIONS + """ +} diff --git a/modules/wdl/psltools/convert/main.wdl b/modules/wdl/psltools/convert/main.wdl new file mode 100644 index 0000000..e721864 --- /dev/null +++ b/modules/wdl/psltools/convert/main.wdl @@ -0,0 +1,67 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_CONVERT — Convert PSL to BED + +version 1.3 + +task convert { + input { + File psl + String extra_args = "" + String prefix = "" + String type = "12" + Boolean gzip = false + } + + String out_prefix = if prefix == "" then basename(psl, ".psl") else prefix + + command <<< + set -euo pipefail + + gzip_arg="" + if ~{gzip}; then + gzip_arg="--gzip" + fi + + psltools convert \ + ~{extra_args} \ + $gzip_arg \ + --psl ~{psl} \ + --out ~{out_prefix}.bed \ + --type ~{type} + >>> + + output { + File bed = "~{out_prefix}.bed" + File? bed_gz = "~{out_prefix}.bed.gz" + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + File psl + String extra_args = "" + String prefix = "" + String type = "12" + Boolean gzip = false + } + + call convert { + input: + psl = psl, + extra_args = extra_args, + prefix = prefix, + type = type, + gzip = gzip + } + + output { + File bed = convert.bed + File? bed_gz = convert.bed_gz + } +} diff --git a/modules/wdl/psltools/filter/main.wdl b/modules/wdl/psltools/filter/main.wdl new file mode 100644 index 0000000..9408f95 --- /dev/null +++ b/modules/wdl/psltools/filter/main.wdl @@ -0,0 +1,54 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_FILTER — Filter PSL files by score, strand, or other criteria. + +version 1.3 + +task filter { + input { + File psl + String extra_args = "" + String prefix = "" + } + + String out_prefix = if prefix == "" then basename(psl, ".psl") else prefix + + command <<< + set -euo pipefail + + psltools filter \ + ~{extra_args} \ + --psl ~{psl} \ + --out-psl ~{out_prefix}.filtered.psl + >>> + + output { + File filtered_psl = "~{out_prefix}.filtered.psl" + File? filtered_psl_gz = "~{out_prefix}.filtered.psl.gz" + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + File psl + String extra_args = "" + String prefix = "" + } + + call filter { + input: + psl = psl, + extra_args = extra_args, + prefix = prefix + } + + output { + File filtered_psl = filter.filtered_psl + File? filtered_psl_gz = filter.filtered_psl_gz + } +} diff --git a/modules/wdl/psltools/merge/main.wdl b/modules/wdl/psltools/merge/main.wdl new file mode 100644 index 0000000..f4dade0 --- /dev/null +++ b/modules/wdl/psltools/merge/main.wdl @@ -0,0 +1,54 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_MERGE — Merge PSL files into a single PSL file. + +version 1.3 + +task merge { + input { + Array[File] psls + String extra_args = "" + String prefix = "merged" + } + + command <<< + set -euo pipefail + + ls *.psl > psl.list + + psltools merge \ + ~{extra_args} \ + --file psl.list \ + --out-psl ~{prefix}.merged.psl + >>> + + output { + File merged_psl = "~{prefix}.merged.psl" + File? merged_psl_gz = "~{prefix}.merged.psl.gz" + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + Array[File] psls + String extra_args = "" + String prefix = "merged" + } + + call merge { + input: + psls = psls, + extra_args = extra_args, + prefix = prefix + } + + output { + File merged_psl = merge.merged_psl + File? merged_psl_gz = merge.merged_psl_gz + } +} diff --git a/modules/wdl/psltools/score/main.wdl b/modules/wdl/psltools/score/main.wdl new file mode 100644 index 0000000..7bdd8f8 --- /dev/null +++ b/modules/wdl/psltools/score/main.wdl @@ -0,0 +1,54 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_SCORE — Score PSL files by summing the values of the alignment scores. + +version 1.3 + +task score { + input { + File psl + String extra_args = "" + String prefix = "" + } + + String out_prefix = if prefix == "" then basename(psl, ".psl") else prefix + + command <<< + set -euo pipefail + + psltools score \ + ~{extra_args} \ + --psl ~{psl} \ + --out ~{out_prefix}.scores.tsv + >>> + + output { + File scores_tsv = "~{out_prefix}.scores.tsv" + File? scores_tsv_gz = "~{out_prefix}.scores.tsv.gz" + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + File psl + String extra_args = "" + String prefix = "" + } + + call score { + input: + psl = psl, + extra_args = extra_args, + prefix = prefix + } + + output { + File scores_tsv = score.scores_tsv + File? scores_tsv_gz = score.scores_tsv_gz + } +} diff --git a/modules/wdl/psltools/sort/main.wdl b/modules/wdl/psltools/sort/main.wdl new file mode 100644 index 0000000..ae9b493 --- /dev/null +++ b/modules/wdl/psltools/sort/main.wdl @@ -0,0 +1,54 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_SORT — Sort PSL files by chromosome, start, or other criteria. + +version 1.3 + +task sort { + input { + File psl + String extra_args = "" + String prefix = "" + } + + String out_prefix = if prefix == "" then basename(psl, ".psl") else prefix + + command <<< + set -euo pipefail + + psltools score \ + ~{extra_args} \ + --psl ~{psl} \ + --out ~{out_prefix}.scores.tsv + >>> + + output { + File scores_tsv = "~{out_prefix}.scores.tsv" + File? scores_tsv_gz = "~{out_prefix}.scores.tsv.gz" + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + File psl + String extra_args = "" + String prefix = "" + } + + call sort { + input: + psl = psl, + extra_args = extra_args, + prefix = prefix + } + + output { + File scores_tsv = sort.scores_tsv + File? scores_tsv_gz = sort.scores_tsv_gz + } +} diff --git a/modules/wdl/psltools/split/main.wdl b/modules/wdl/psltools/split/main.wdl new file mode 100644 index 0000000..c8c02db --- /dev/null +++ b/modules/wdl/psltools/split/main.wdl @@ -0,0 +1,54 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_SPLIT — Split PSL files into multiple PSL files. + +version 1.3 + +task split { + input { + File psl + String extra_args = "" + String prefix = "" + } + + String out_prefix = if prefix == "" then basename(psl, ".psl") else prefix + + command <<< + set -euo pipefail + + psltools split \ + ~{extra_args} \ + --psl ~{psl} \ + --out-prefix ~{out_prefix} + >>> + + output { + Array[File] psls = glob("*.psl") + Array[File] psls_gz = glob("*.psl.gz") + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + File psl + String extra_args = "" + String prefix = "" + } + + call split { + input: + psl = psl, + extra_args = extra_args, + prefix = prefix + } + + output { + Array[File] psls = split.psls + Array[File] psls_gz = split.psls_gz + } +} diff --git a/modules/wdl/psltools/stats/main.wdl b/modules/wdl/psltools/stats/main.wdl new file mode 100644 index 0000000..9a76cd4 --- /dev/null +++ b/modules/wdl/psltools/stats/main.wdl @@ -0,0 +1,59 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_STATS — Get statistics about PSL files. + +version 1.3 + +task stats { + input { + File psl + String extra_args = "" + String prefix = "" + } + + String out_prefix = if prefix == "" then basename(psl, ".psl") else prefix + + command <<< + set -euo pipefail + + extension=".tsv" + if [[ "~{extra_args}" == *"--json"* ]]; then + extension=".json" + fi + + psltools stats \ + ~{extra_args} \ + --psl ~{psl} \ + > ~{out_prefix}.stats$extension + >>> + + output { + File? stats_json = "~{out_prefix}.stats.json" + File? stats_tsv = "~{out_prefix}.stats.tsv" + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + File psl + String extra_args = "" + String prefix = "" + } + + call stats { + input: + psl = psl, + extra_args = extra_args, + prefix = prefix + } + + output { + File? stats_json = stats.stats_json + File? stats_tsv = stats.stats_tsv + } +} diff --git a/modules/wdl/psltools/swap/main.wdl b/modules/wdl/psltools/swap/main.wdl new file mode 100644 index 0000000..06fe715 --- /dev/null +++ b/modules/wdl/psltools/swap/main.wdl @@ -0,0 +1,54 @@ +# Copyright (c) 2026 The Hiller Lab at the Senckenberg Gessellschaft für Naturforschung +# Distributed under the terms of the Apache License, Version 2.0. + +# PSLTOOLS_SWAP — Swap PSL files from reference to query. + +version 1.3 + +task swap { + input { + File psl + String extra_args = "" + String prefix = "" + } + + String out_prefix = if prefix == "" then basename(psl, ".psl") else prefix + + command <<< + set -euo pipefail + + psltools swap \ + ~{extra_args} \ + --psl ~{psl} \ + --out-psl ~{out_prefix}.swapped.psl + >>> + + output { + File swapped_psl = "~{out_prefix}.swapped.psl" + File? swapped_psl_gz = "~{out_prefix}.swapped.psl.gz" + } + + requirements { + container: "ghcr.io/alejandrogzi/psltools:latest" + } +} + +workflow run { + input { + File psl + String extra_args = "" + String prefix = "" + } + + call swap { + input: + psl = psl, + extra_args = extra_args, + prefix = prefix + } + + output { + File swapped_psl = swap.swapped_psl + File? swapped_psl_gz = swap.swapped_psl_gz + } +}