访问嵌套参数snakemake

时间:2019-03-22 17:23:20

标签: python snakemake

我有一个如下配置文件:

params:
- a:
    - sample: sample_A
    - var1: blood_a
- b:
    - sample: sample_b
    - var1: blood_b

在有更多样本可用的情况下,可以不仅仅是a和b。 嵌套参数时如何工作?我已经尝试过使用非嵌套参数;扩展,格式化,lambda,但我还没有成功。

1 个答案:

答案 0 :(得分:1)

这实际上取决于上下文。请您充实您想如何在规则中使用此构造。

如果您只有一个输入文件和该文件的处理规则,但是要在处理该文件时使用几组不同的参数,则可以设置以下内容:

param_indices=params["params"].keys()

rule all:
    input:
        expand("results_{param_set}", param_set=param_indices)

rule process_me:
    input:
        "some_file"
    output:
        "results_{param_set}"
    params:
        sample=params[param_set]["sample"],
        var1=params[param_set]["var1"]
    run:
        """
        touch {output}
        """

但是,设置配置文件稍有不同可能会更整洁。如果是制表符分隔的文件

param_index    sample    var1
a              sample_A    blood_a
b              sample_b    blood_b

..您可以使用此处描述的工作流程(https://snakemake.readthedocs.io/en/stable/snakefiles/configuration.html#tabular-configuration)。

## config.yaml
sample_file: samples.tsv
## samples.tsv
param_index    sample    var1
a              sample_A    blood_a
b              sample_b    blood_b
## Snakefile
import pandas as pd

configfile: "config.yaml"

samples = pd.read_table(
    config["sample_file"]
).set_index(
    "param_index", drop=False
)

rule all:
    expand(
        "results_{param_set}", param_set=samples["param_index"]
    )

rule process_me:
    input:
        "some_file"
    output:
        "results_{param_set}"
    params:
        sample=params.loc(param_set, "sample"),
        var1=params.loc(param_set, "var1")
    run:
        """
        touch {output}
        """

诚然,这不是如何使用表格配置的最佳示例。但是,与yaml格式相比,它可能更容易捕获打字错误和类型不匹配。