Snakemake 通配符内的通配符

Wildcard within wildcard in Snakemake

我最近开始使用 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

如果只针对一组,我知道该怎么做,但如果我对两个组都这样做,那么我在 analyse 中扩展的通配符 sample_from_group 需要取决于该组我得到了错误

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(或函数):

rule analyse:
    input:
        lambda wildcards: expand("{sample_from_group}",
                             sample_from_group=grouped_samples[wildcards.group].split())