Snakemake:对多个子组的一个输出使用多个输入的规则

时间:2018-02-27 12:35:10

标签: python bioinformatics snakemake

我有一个工作流程,用于下载,对齐和执行对公共排序数据的变体调用。问题是它目前只能在每个样本的基础上工作(样本作为每个单独的测序实验)。如果我想对一组实验(例如样本的生物学和/或技术重复)进行变体调用,它就无法工作。我试图解决它,但我无法解决它。

这是对齐规则的简化:

rule alignment:
    input:
        rules.download.output.fastq
    output:
        '{group}/alignment/{sample}.bam'
    shell:
        "bash scripts/02_alignment.sh {wildcards.group} {wildcards.samples}"

变体调用也是如此:

rule variant_calling:
    input:
        rules.alignment.output
    output:
        '{group}/variants/{sample}.vcf.gz'
    shell:
        "bash scripts/03_variant_calling.sh {wildcards.sample} {wildcards.group}"

这很好用,因为为每个对齐的.vcf文件生成了一个.bam文件。但我想要做的是从任意数量的.vcf文件生成一个.bam文件。我有一个pandas数据框,其中包含所有sample个名称及其对应的group。我基本上想将第二条规则的output更改为'{group}/variants/{group}.vcf',但我所做的一切都以某种方式失败了。

我的想法是提供规则,将所有每组对齐的.bam文件作为输入,然后只给脚本运行它们所有谎言的目录。问题是我无法找到以这种每组方式提供输入的方法:要么我给每个样本(作为工作流水线),要​​么为每个组提供所有.bam个文件变体调用,无论它们实际属于哪个组。我不能只使用通配符,因为最后一个输出中不存在{sample}通配符。我也尝试使用函数作为输入,但这导致了与上面相同的问题。

问题的症结似乎是分组的层次:如果我想对整个数据集中的所有对齐.bam文件执行变体调用,那可能会正常工作,给出我上面提到的问题。问题来自整个数据集的子组:

  sample1      sample2             sample1      sample2      sample3
     |            |                   |            |            |
     |            |                   |            |            |
     --------------                   ---------------------------
            |                                      |
            |                                      |
          group1                                 group2

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:3)

您必须使用某种结构将样品分组:

GROUPS = {
    "group1":["sample1","sample2"],
    "group2":["sample1","sample2","sample3"]
}

然后是这样的:

rule all:
    input:
         expand("{group}/variants/{group}.vcf.gz", group=list(GROUPS.keys()))

rule alignment:
    input:
        rules.download.output.fastq
    output:
        '{group}/alignment/{sample}.bam'
    shell:
        "bash scripts/02_alignment.sh {wildcards.group} {wildcards.samples}"

rule variant_calling:
    input:
        lambda wildcards: expand("{group}/alignment/{sample}.bam", group=wildcards.group, sample=GROUPS[wildcards.group]
    output:
        '{group}/variants/{group}.vcf.gz'
    shell:
        "bash scripts/03_variant_calling.sh {input} {output}"

当然缺少你没有展示的规则,但我认为你会明白这一点!

规则variant_calling中的shell命令可能很难处理,但您可以将目录定义为如下所示的参数:

params: groupAlignDir = "{group}/alignment"

并在shell中使用它:

"bash scripts/03_variant_calling.sh {params.groupAlignDir} {output}"

并获取脚本“variant_calling.sh”

目录中的所有bam文件