1

是否有地方完全描述了蛇形规则中配置数据的使用?

在 yaml 文件的用户指南中有一个示例:

samples:
    A: data/samples/A.fastq
    B: data/samples/B.fastq

然后,它在这样的规则中使用:

bam=expand("sorted_reads/{sample}.bam", sample=config["samples"]),

上面的内容似乎将 {sample} 替换为“data/samples/A.fastq”,而不是像显然那样替换为“A”(和“B”等)。

在输出规则中使用配置数据的正确方法是什么,例如帮助形成输出文件名?此表格不起作用:

output: "{config.dataFolder}/{ID}/{ID}.yyy"

如果我在 yaml 文件中定义复杂的结构化数据,我正在寻找语法指导——如何在蛇规则中使用它?什么时候使用 Python 语法,什么时候使用 SnakeMake 语法?

yaml 和 JSON 配置文件受到严格限制,因为它们不能使用文件中前面定义的值来定义新值,对吧?这是设置配置参数时经常要做的事情。

使用配置文件有什么好处?为什么不直接使用 include: 一个包含 python 文件来定义参数呢?

一个有用的东西是参考手册,它彻底描述了 SnakeMake 的细节。当前的网站有点分散,需要一段时间才能找到您记得以前在其中某处看到的东西。

4

3 回答 3

1

应该如何在“输出”规则中使用配置数据?我发现输出字符串不能包含 {config.} 值。但是,可以使用 Python 代码包含它们,如下所示:

output: config["OutputDir"] + "/myfile.txt"

但是,这种方法不起作用(在输出:或输入:):

params: config=config
output: "{params.config[OutputDir]}/myfile.txt"

但是,它确实在“shell:”中工作:

params: config=config
output: config["OutputDir"] + "/myfile.txt"
shell: echo "OutputDir is {params.config[OutputDir]}" > {output}

请注意,shell cmd 中 [] 内的 OutputDir 周围没有引号。在字符串中扩展值的 {} 方法不使用键周围的引号。

可以按蛇文件方式或按python方式定义配置数据吗?是的!

参数可以在使用“configfile”包含的 .yaml 文件中定义,也可以通过使用“include”包含的常规 Python 文件定义。后者是恕我直言,因为 .yaml 文件不允许定义引用以前的定义,这在除了最简单的配置文件之外的所有文件中都很常见。

要使用 yaml 定义上面的“OutputDir”参数:

xxx.yaml:

OutputDir: DATA_DIR

蛇文件:

configfile: 'xxx.yaml'

要使用 Python 将其定义为与上述完全兼容:

xxx.py:

config['OutputDir'] = "DATA_DIR"

蛇文件:

include: 'xxx.py'

或者,在 Python 包含的配置文件中定义一个简单的变量“OutputDir”,然后在规则中使用它:

xxx.py:

OutputDir = "DATA_DIR"

蛇文件:

include: 'xxx.py'
rule:
    output: OutputDir + "/myfile.txt"

可以通过 .yaml 文件和 python 文件轻松定义和访问多嵌套字典和列表。例子:

MACBOOK> cat cfgtest.yaml
cfgtestYAML:

    A: 10
    B: [1, 2, 99]
    C:
        nst1: "hello"
        nst2: ["big", "world"]

MACBOOK> cat cfgtest.py
cfgtestPY = {

    'X': -2,
    'Y': range(4,7),
    'Z': {
        'nest1': "bye",
        'nest2': ["A", "list"]
        }
    }

MACBOOK> cat cfgtest
configfile: "cfgtest.yaml"
include: "cfgtest.py"

rule:
    output: 'cfgtest.txt'
    params: YAML=config["cfgtestYAML"], PY=cfgtestPY
    shell:
        """
        echo "params.YAML[A]: {params.YAML[A]}"             >{output}
        echo "params.YAML[B]: {params.YAML[B]}"             >>{output}
        echo "params.YAML[B][2]: {params.YAML[B][2]}"       >>{output}
        echo "params.YAML[C]: {params.YAML[C]}"             >>{output}
        echo "params.YAML[C][nst1]: {params.YAML[C][nst1]}" >>{output}
        echo "params.YAML[C][nst2]: {params.YAML[C][nst2]}" >>{output}
        echo "params.YAML[C][nst2][1]: {params.YAML[C][nst2][1]}" >>{output}

        echo "" >>{output}

        echo "params.PY[X]: {params.PY[X]}"                 >>{output}
        echo "params.PY[Y]: {params.PY[Y]}"                 >>{output}
        echo "params.PY[Y][2]: {params.PY[Y][2]}"           >>{output}
        echo "params.PY[Z]: {params.PY[Z]}"                 >>{output}
        echo "params.PY[Z][nest1]: {params.PY[Z][nest1]}"     >>{output}
        echo "params.PY[Z][nest2]: {params.PY[Z][nest2]}"     >>{output}
        echo "params.PY[Z][nest2][1]: {params.PY[Z][nest2][1]}" >>{output}
        """

MACBOOK> snakemake -s cfgtest
Provided cores: 1
Rules claiming more threads will be scaled down.
Job counts:
    count   jobs
    1   1
    1

rule 1:
    output: cfgtest.txt
    jobid: 0

Finished job 0.
1 of 1 steps (100%) done

MACBOOK> cat cfgtest.txt
params.YAML[A]: 10
params.YAML[B]: 1 2 99
params.YAML[B][2]: 99
params.YAML[C]: {'nst1': 'hello', 'nst2': ['big', 'world']}
params.YAML[C][nst1]: hello
params.YAML[C][nst2]: big world
params.YAML[C][nst2][1]: world

params.PY[X]: -2
params.PY[Y]: range(4, 7)
params.PY[Y][2]: 6
params.PY[Z]: {'nest1': 'bye', 'nest2': ['A', 'list']}
params.PY[Z][nest1]: bye
params.PY[Z][nest2]: A list
params.PY[Z][nest2][1]: list
于 2017-08-03T22:09:20.433 回答
0

YAML 配置

这与 YAML 文件的嵌套有关,请参见此处的示例。

config["samples"] 请求将返回“A”和“B”。我是我的头脑,我认为它会返回一个列表,但我对变量类型并不积极。

通过使用此处列出的配置文件: https ://snakemake.readthedocs.io/en/latest/tutorial/advanced.html

您可以以 YAML 格式链接以下 YAML 配置文件。

设置/config.yaml:

samples:
    A
    B

或者

设置/config.yaml:

sampleID:
    123
    124
    125
baseDIR:
    data

使用 YAML 配置访问的结果调用

蛇文件:

configfile: "settings/config.yaml"

rule all:
    input:
        expand("{baseDIR}/{ID}.bam", baseDIR=config["baseDIR"], ID=config["sampleID"]),


rule fastq2bam:
    input:
        expand("{{baseDIR}}/{{ID}}.{readDirection}.fastq", readDirection=['1','2'])
    output:
        "{baseDIR}/{ID}.bam"
        #Note different number of {}, 1 for wildcards not in expand.
        #Equivalent line with 'useless' expand call would be:
        #expand("{{baseDIR}}/{{ID}}.bam")

    shell:
    """
    bwa mem {input[0]} {input[1]} > {output}
    """

虚拟示例,只是试图举例说明不同字符串和配置变量的使用。我在 fastq2bam 规则中使用通配符。通常,我只使用配置变量在我的规则“全部”中进行设置,如果可能,这是最佳实践。我不能说 shell 调用是否真的适用于 bwa mem,但我想你明白我的意思了。

可以在这里看到更大版本的 Snakefile

设置配置文件后,要引用其中的任何内容,请使用“配置”。它可用于根据需要深入访问 YAML。在这里,我将降低 3 个假设级别,如下所示:

hypothetical_var = config["yamlVarLvl1"]["yamlVarLvl2"]["yamlVarLvl3"]

等于(我对打字不持肯定态度,我认为它会转换为字符串)

 hypothetical_var = ['124', '125', '126', '127', '128', '129']

如果 YAML 是:

yamlVarLvl1:
    yamlVarLvl2:
        yamlVarLvl3:
            '124'
            '125'
            '126'
            '127'
            '128'
            '129'

代码组织

Python 和 Snakemake 代码大部分可以在某些地方交错。我建议不要这样做,因为它会使代码难以维护。由用户决定如何实现这一点。例如,使用 run 或 shell 指令会改变访问变量的方式。

YAML 和 JSON 文件是首选的配置变量文件,因为我相信它们为变量的编辑和命令行界面覆盖提供了一些支持。如果它是使用外部导入的 python 变量实现的,这将不会那么干净。它还有助于我的大脑,知道 python 文件做事,YAML 文件存储东西。

YAML 始终是一个外部文件,但是...

  1. 如果您使用的是单个 Snakefile,请将支持的 python 放在顶部?
  2. 如果您使用的是多文件系统,请考虑将支持的 python 脚本外部化。

教程

我认为完美的小插图很难设计。我正在尝试向我的团队教授 Snakemake,我有超过 40 页的个人书面文档,我提供了三个 1 小时以上的演示文稿和 PowerPoint 幻灯片,我已经阅读了几乎整个 ReadTheDocs.io Snakemake 手册,我只是最近完成了附加资源列表,但是,我也在学习!

旁注,我发现本教程 也非常好。

这是否提供了足够的上下文?

于 2017-08-03T20:47:32.277 回答
0

是否有地方完全描述了蛇形规则中配置数据的使用?

只要可以将其解析为 python 对象,您可以在配置文件中放入的内容没有限制。基本上,“你的想象力是极限”。

在输出规则中使用配置数据的正确方法是什么,例如帮助形成输出文件名?

我用普通的python从规则之外的配置中提取东西。

而不是output: "{config.dataFolder}/{ID}/{ID}.yyy",我会这样做:

data_folder = config.dataFolder

rule name_of_the_rule:
    output:unction
        os.path.join(data_folder, "{ID}", "{ID}.yyy")

我想你所尝试的,当有来自通配符和其他的东西混合时,snakemake 在格式化字符串时遇到问题。但也许以下工作在 python 3.6 中,使用格式化的字符串 litterals : output: f"{config.dataFolder}/{ID}/{ID}.yyy"。我没有检查。

如果我在 yaml 文件中定义复杂的结构化数据,我正在寻找语法指导——如何在蛇规则中使用它?什么时候使用 Python 语法,什么时候使用 SnakeMake 语法?

在蛇文件中,我通常会在规则之前读取配置文件以提取配置信息。这本质上是纯 python,只是config为了方便起见,Snakemake 直接提供了一个对象。您可能只使用普通标准 python 使用config = json.load("config.json")or config = yaml.load("config.yaml")

在蛇文件中,在规则之外,您可以在 python 中进行任何您想要的计算。这可以在读取配置之前以及之后。您可以定义可在规则中使用的函数(例如生成规则的输入),计算将用作通配符的事物列表。我认为唯一的事情是需要在使用它的规则之前定义一个对象。

Snakemake 语法似乎主要是描述规则的一种手段。在run规则的一部分内,你可以使用任何你想要的 python,知道你可以访问一个wildcards对象来帮助你。规则的输入和输出是文件路径列表,您可以使用 python 来构建它们。

于 2017-08-08T07:46:58.107 回答