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.
我正在使用 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.