[英]Snakemake: {input:q} does not return quoted input
我正在開發一個 ATACseq 管道,使用 Genrich 與 Snakemake 一起運行。
事實上,Genrich 允許在同一步驟中調用來自多個重復的峰,避免額外的步驟(即 IDR)。
在 Snakemake 中,我找到了同時返回我想要的所有樣本(即從一個條件復制)的方法,但如果每個文件都被引用,則 Genrich 要求以逗號分隔的文件作為輸入或以空格分隔的文件。
通常,輸入返回一個空格分隔文件列表(即 file1 file2 file3),由於我不知道如何讓它返回逗號分隔文件,我試圖引用它們。
從理論上講,Snakemake版本5.8.0后,你可以參考輸入為{input:q}
在規則的shell命令返回引用輸入,如說在這里。
但是,就我而言,返回的輸入沒有被引用。
我創建了一個測試規則來查看輸入是如何返回的:
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}
"""
存儲在輸出文件中的返回輸入是:
rep1.sorted.bam rep2.sorted.bam
有人知道如何解決這個問題並返回帶引號的輸入或返回逗號分隔文件列表而不是空格分隔文件嗎?
謝謝你。
假設您的輸入文件名不包含空格(如果有,我強烈建議避免使用它們),您可以簡單地將文件列表放在引號中,您不需要引用列表中的每個文件:
rule genrich:
input:
t= ['a.bam', 'b.bam'],
...
shell:
r"""
Genrich -t '{input.t}' ...
"""
(注意'{input.t}'
周圍'{input.t}'
單引號)
我在想 echo 和 shell 可能會在管道輸出之前剝離引號,但是使用snakemake -p
檢查正在執行的命令表明它們不存在。 當存在空格時,似乎引號只與單個文件名一起顯示。
Dariober 的答案應該可以引用該列表,但為了完整起見,如果您想要一個逗號分隔的文件列表,請在 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}
"""
編輯
這是一個玩具示例,演示了 params 與輸入的使用:
# 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
...
另外,作為顯示在這里
請注意,與 input 指令相比,params 指令可以選擇接受更多的參數,而不僅僅是通配符,即輸入、輸出、線程和資源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.