Skip to content

Commit

Permalink
fix: allow for arbitrary filename prefixes in the optitype wrapper (#500
Browse files Browse the repository at this point in the history
)

### 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 <johannes.koester@uni-due.de>
  • Loading branch information
dlaehnemann and johanneskoester committed Mar 28, 2023
1 parent e2215f2 commit 0bf7175
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 13 deletions.
3 changes: 2 additions & 1 deletion bio/optitype/test/Snakefile
Expand Up @@ -3,7 +3,8 @@ rule optitype:
# list of input reads
reads=["reads/{sample}_1.fished.fastq", "reads/{sample}_2.fished.fastq"]
output:
multiext("optitype/{sample}", "_coverage_plot.pdf", "_result.tsv")
pdf="optitype/{sample}_coverage_plot.pdf",
tsv="optitype/{sample}_result.tsv",
log:
"logs/optitype/{sample}.log"
params:
Expand Down
27 changes: 15 additions & 12 deletions bio/optitype/wrapper.py
@@ -1,15 +1,15 @@
__author__ = "Jan Forster"
__author__ = "Jan Forster, David Lähnemann"
__copyright__ = "Copyright 2020, Jan Forster"
__email__ = "j.forster@dkfz.de"
__license__ = "MIT"


import os
from tempfile import TemporaryDirectory
from snakemake.shell import shell

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

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

shell(
"(OptiTypePipeline.py"
" --input {snakemake.input.reads}"
" --outdir {outdir}"
" --prefix {snakemake.wildcards.sample}"
" {seq_type}"
" {config}"
" {extra})"
" {log}"
)
with TemporaryDirectory() as tempdir:
shell(
"(OptiTypePipeline.py"
" --input {snakemake.input.reads}"
" --outdir {tempdir}"
" --prefix tmp_prefix"
" {seq_type}"
" {config}"
" {extra}; "
" mv {tempdir}/tmp_prefix_coverage_plot.pdf {snakemake.output.pdf:q} ;"
" mv {tempdir}/tmp_prefix_result.tsv {snakemake.output.tsv:q} )"
" {log}"
)

0 comments on commit 0bf7175

Please sign in to comment.