Skip to content

Commit 0bf7175

Browse files
fix: allow for arbitrary filename prefixes in the optitype wrapper (#500)
### Description This is a first attempt, will update with a tmp-folder based solution in a bit. ### QC For all wrappers added by this PR, I made sure that * [ ] there is a test case which covers any introduced changes, * [ ] `input:` and `output:` file paths in the resulting rule can be changed arbitrarily, * [ ] either the wrapper can only use a single core, or the example rule contains a `threads: x` statement with `x` being a reasonable default, * [ ] rule names in the test case are in [snake_case](https://en.wikipedia.org/wiki/Snake_case) and somehow tell what the rule is about or match the tools purpose or name (e.g., `map_reads` for a step that maps reads), * [ ] all `environment.yaml` specifications follow [the respective best practices](https://stackoverflow.com/a/64594513/2352071), * [ ] wherever possible, command line arguments are inferred and set automatically (e.g. based on file extensions in `input:` or `output:`), * [ ] all fields of the example rules in the `Snakefile`s and their entries are explained via comments (`input:`/`output:`/`params:` etc.), * [ ] `stderr` and/or `stdout` are logged correctly (`log:`), depending on the wrapped tool, * [ ] temporary files are either written to a unique hidden folder in the working directory, or (better) stored where the Python function `tempfile.gettempdir()` points to (see [here](https://docs.python.org/3/library/tempfile.html#tempfile.gettempdir); this also means that using any Python `tempfile` default behavior works), * [ ] the `meta.yaml` contains a link to the documentation of the respective tool or command, * [ ] `Snakefile`s pass the linting (`snakemake --lint`), * [ ] `Snakefile`s are formatted with [snakefmt](https://github.com/snakemake/snakefmt), * [ ] Python wrapper scripts are formatted with [black](https://black.readthedocs.io). --------- Co-authored-by: Johannes Köster <[email protected]>
1 parent e2215f2 commit 0bf7175

File tree

2 files changed

+17
-13
lines changed

2 files changed

+17
-13
lines changed

bio/optitype/test/Snakefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,8 @@ rule optitype:
33
# list of input reads
44
reads=["reads/{sample}_1.fished.fastq", "reads/{sample}_2.fished.fastq"]
55
output:
6-
multiext("optitype/{sample}", "_coverage_plot.pdf", "_result.tsv")
6+
pdf="optitype/{sample}_coverage_plot.pdf",
7+
tsv="optitype/{sample}_result.tsv",
78
log:
89
"logs/optitype/{sample}.log"
910
params:

bio/optitype/wrapper.py

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
__author__ = "Jan Forster"
1+
__author__ = "Jan Forster, David Lähnemann"
22
__copyright__ = "Copyright 2020, Jan Forster"
33
__email__ = "[email protected]"
44
__license__ = "MIT"
55

66

77
import os
8+
from tempfile import TemporaryDirectory
89
from snakemake.shell import shell
910

1011
extra = snakemake.params.get("extra", "")
1112
log = snakemake.log_fmt_shell(stdout=True, stderr=True)
12-
outdir = os.path.dirname(snakemake.output[0])
1313

1414
# get sequencing type
1515
seq_type = snakemake.params.get("sequencing_type", "dna")
@@ -20,13 +20,16 @@
2020
if any(config):
2121
config = "--config {}".format(config)
2222

23-
shell(
24-
"(OptiTypePipeline.py"
25-
" --input {snakemake.input.reads}"
26-
" --outdir {outdir}"
27-
" --prefix {snakemake.wildcards.sample}"
28-
" {seq_type}"
29-
" {config}"
30-
" {extra})"
31-
" {log}"
32-
)
23+
with TemporaryDirectory() as tempdir:
24+
shell(
25+
"(OptiTypePipeline.py"
26+
" --input {snakemake.input.reads}"
27+
" --outdir {tempdir}"
28+
" --prefix tmp_prefix"
29+
" {seq_type}"
30+
" {config}"
31+
" {extra}; "
32+
" mv {tempdir}/tmp_prefix_coverage_plot.pdf {snakemake.output.pdf:q} ;"
33+
" mv {tempdir}/tmp_prefix_result.tsv {snakemake.output.tsv:q} )"
34+
" {log}"
35+
)

0 commit comments

Comments
 (0)