我最近开始使用Snakemake。
我想达到的目的是这样的。我有一些 samples
需要单独修改(规则 index_vcf
). 然后,样本组是另一个规则的输入(analyse
),我们得到每组的输出,在 groups
.
我想让第二条规则运行两个命令。
some_script --input_files 'A2 Ah AL' --output ../out/A.out
和...
some_script --input_files 'Banana BLM' --output ../out/B.out
如果只针对一组,我知道该怎么做,但如果同时针对两组,那么通配符 sample_from_group
我正在扩展的 analyse
需要依赖于组,我得到了错误的消息。
unhashable type: 'list'
这是我的配置文件。
groups:
- A
- B
samples:
- A2
- Ah
- AL
- Banana
- BLM
grouped_samples:
A: A2_mod, Ah_mod, AL_mod
B: Banana_mod, BLM_mod
这是我的Snakefile
configfile: "config_PCAWG.yaml"
samples = config["samples"]
groups = config["groups"]
grouped_samples = config["grouped_samples"]
rule all:
input:
expand("../out/{group}.out", group = groups)
rule index_vcf:
input:
"../data/{sample}"
output:
"../data/{sample}_mod"
shell:
"tabix -f {input}"
rule analyse:
input:
expand("{sample_from_group}", sample_from_group=grouped_samples[{group}].split())
output:
"../out/{group}.out
shell:
"some_script --input_files '{input}' --output {output}"
首先,你需要纠正错误的打印(例如,有一个字符串没有闭合引号)。其次,有一个逻辑错误,即没有规则产生任何与模式相匹配的内容。"../out/{group}.out"
. 你是说... "../data/{group}.out"
?
现在是主要部分。这是一种无效的语法。
expand("{sample_from_group}", sample_from_group=grouped_samples[{group}].split())
你的意思是一个lambda(或一个函数)... ...接受一个通配符并产生一个expand:
rule analyse:
input:
lambda wildcards: expand("{sample_from_group}",
sample_from_group=grouped_samples[wildcards.group].split())