Snakemake:{input:q} 没有 return 引用输入

Snakemake: {input:q} does not return quoted input

我正在使用 Genrich 开发一个 ATACseq 管道到 运行 和 Snakemake。

事实是 Genrich 允许在同一步骤中调用多个重复的峰,避免额外的步骤(即 IDR)。

在 Snakemake 中,我找到了同时 return 我想要的所有样本(即从一个条件复制)的方法,但是 Genrich 要求以逗号分隔的文件作为输入或 space-分隔文件,如果每个文件都被引用。

通常,输入 return 一个 space 分隔的文件列表(即 file1 file2 file3),因为我不知道如何使它成为 return 逗号-分隔文件,我试着引用它们。

理论上,Snakemake 5.8.0版本后,可以将规则的shell命令中的{input:q}引用为return引用的输入,如here.

但是,在我的例子中,returned 输入没有被引用。

我创建了一个测试规则来查看输入是如何returned:

rule genrich_merge_test:
    input:
        lambda w: expand("{condition}.sorted.bam", condition = SAMPLES.loc[SAMPLES["CONDITION"] == w.condition].NAME),
    output:
        "{condition}_peaks.narrowPeak",
    shell:
        """
        echo {input:q} > {output}     
        """

而存储在输出文件中的 returned 输入是:

rep1.sorted.bam rep2.sorted.bam

有人知道如何解决这个问题和 return 引用输入或 return 逗号分隔文件列表而不是 space 分隔文件吗?

谢谢。

假设您输入的文件名不包含空格(如果有,我强烈建议避免使用空格),您可以简单地将文件列表放在引号中,您不需要引用列表中的每个文件:

rule genrich:
    input:
        t= ['a.bam', 'b.bam'],
    ...
    shell:
        r"""
        Genrich -t '{input.t}' ...
        """

(注意 '{input.t}' 周围的单引号)

我在想 echo 并且 shell 可能会在管道输出之前去除引号,但是检查 snakemake -p 以查看正在执行的命令表明它们不存在。当存在空格时,引号似乎只与单个文件名一起显示。

Dariober 的回答应该可以引用列表,但为了完整起见,如果您想要一个 comma-separated 文件列表,请在 params 指令中使用 lambda 函数:

rule genrich_merge_test:
    input:
        lambda w: expand("{condition}.sorted.bam", 
                         condition=SAMPLES.loc[SAMPLES["CONDITION"] == w.condition].NAME),
    params:
        files=lambda wildcards, input: ','.join(input)
    output:
        "{condition}_peaks.narrowPeak",
    shell:
        """
        echo {params.files} > {output}     
        """

编辑

这是一个玩具示例,演示如何将参数与输入一起使用:

# snakefile
inputs = expand('{wc}.out', wc=range(4))

rule all:
    input: "test_peaks.narrowPeak"

rule genrich:
    input:
        inputs
    params:
        files=lambda wildcards, input: ','.join(input)
    output:
        "test_peaks.narrowPeak",
    shell:
        """
        echo {params.files} > {output}     
        """

rule generator:
    output: touch('{file}.out')
$ snakemake -np
...
rule genrich:
    input: 0.out, 1.out, 2.out, 3.out
    output: test_peaks.narrowPeak
    jobid: 1


        echo 0.out,1.out,2.out,3.out > test_peaks.narrowPeak 
...

也如图所示here

Note that in contrast to the input directive, the params directive can optionally take more arguments than only wildcards, namely input, output, threads, and resources.