Snakemake表格配置,扩展和合并-如何正确扩展输入文件?

时间:2019-10-09 20:32:16

标签: snakemake

对于以下内容,我将不胜感激。我有一个TSV样本表:

Sample  Unit    Tumor_or_Normal Fastq1  Fastq2
A       1       T       reads/a.t.1.fastq       reads/a.t.2.fastq
A       2       N       reads/a.n.1.fastq       reads/a.n.2.fastq
B       1       T       reads/b.t1.1.fastq      reads/b.t1.2.fastq
...

并在

中读取
samples = pd.read_table(config["samples"], dtype=str).set_index(["Sample", "Unit", "Tumor_or_Normal"], drop=False)
samples.index = samples.index.set_levels([i.astype(str) for i in samples.index.levels])

我想合并所有具有相同Sample和Tumor_or_Normal的bam文件。例如,C-1-T.bam和C-2-T.bam和C-3-T.bam应该合并为C-T.bam。我有规则

rule merge_recal_by_unit:
    input:
        expand("recal/{{Sample}}-{Unit}-{{Tumor_or_Normal}}.bam",
                Unit=samples.loc[samples.Sample].Unit)
    output:
        bam=protected("merged/{Sample}-{Tumor_or_Normal}.bam")
    params:
        ""
    threads:
        8
    wrapper:
        "0.39.0/bio/samtools/merge"

但是这给了InputFunctionException。我也尝试过将扩展替换为

lamblda wildcards: expand("recal/{{Sample}}-{Unit}-{{Tumor_or_Normal}}.bam",
                           Unit=samples.loc[wildcards.Sample].Unit)

但这给了我一个语法错误,并且

expand("recal/{{Sample}}-{Unit}-{{Tumor_or_Normal}}.bam",
       Unit=samples.index.get_level_values('Unit').unique().values())

导致消息numpy.ndarray对象不可调用。这似乎类似于thisthis的问题,但我无法使其正常工作。

这里的任何帮助将不胜感激。非常感谢!

1 个答案:

答案 0 :(得分:0)

似乎您想查询示例表以获取共享相同的SampleTumor_or_Normal的所有行,并使用Unit的列表来构造bam文件的输入列表。如果是这样,应该执行以下操作:

rule merge_recal_by_unit:
    input:
        lambda wc: ['recal/{Sample}-%s-{Tumor_or_Normal}.bam' % x for x in 
            samples[(samples.Sample == wc.Sample) & (samples.Tumor_or_Normal == wc.Tumor_or_Normal)].Unit]
    output:
        bam=protected("merged/{Sample}-{Tumor_or_Normal}.bam")
    ...