gpt4 book ai didi

python - 在规则中使用配置数据的语法

转载 作者:太空宇宙 更新时间:2023-11-03 14:56:47 26 4
gpt4 key购买 nike

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

用户指南中的 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: an include python 文件来定义参数?

一个有用的东西是一本全面描述 SnakeMake 细节的引用手册。当前的网站有点分散,需要一段时间才能找到您记得以前在其中某个地方看到过的内容。

最佳答案

在“输出”规则中应该如何使用配置数据?我发现输出字符串不能包含 {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

关于python - 在规则中使用配置数据的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45494047/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com