snakemake 中的未知输出
unknown output in snakemake
我正在努力在 snakemake 中实现一个非常简单的管道,希望用一个有凝聚力的 Snakefile 替换一系列烦人的 bash 脚本。
我在编写将文件拆分成更小的部分(使用 GNU 拆分)然后导致将输出连接在一起的第二条规则时遇到问题。
我不知道在 concat 步骤中为输入写什么,因为我不知道如何定义所有符合模式的文件 bam_files/test*
。我尝试使用 glob,但这显然不起作用(看起来它实际上是在跳过包含 glob 的拆分)。有没有更好的方法可以做到这一点?
# test snakemake pipeline
import glob
SAMPLE_IDS = ["test"]
rule all:
input:
expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)
rule split:
input:
expand("{FASTQ}.txt", FASTQ=SAMPLE_IDS)
output:
"bam_files/{FASTQ}."
shell:
"cat {input} | split -l 1000 -d - {output}."
rule concat:
input:
split_files = glob.glob("bam_files/{FASTQ}.*")
output:
"bam_files/{FASTQ}.out"
shell:
"cat {input} > {output}"
我认为这应该可行:
SAMPLE_IDS = ["test"]
rule all:
input:
expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)
rule split:
input:
"{FASTQ}.txt"
output:
dynamic("bam_files/{FASTQ}.{PART}")
params:
length=1000
shell:
"cat {input} | split -l {params.length} -d - bam_files/{FASTQ}."
rule concat:
input:
split_files = dynamic("bam_files/{FASTQ}.{PART}")
output:
"bam_files/{FASTQ}.out"
shell:
"cat {input} > {output}"
看起来 split
规则应该一次获取一个文件 {FASTQ}.txt
并生成 {FASTQ}.1, {FASTQ}.2, ...
或类似的东西。因为您事先不知道它会产生多少文件,所以您需要对 split.output
和 concat.input
.
使用 dynamic()
我正在努力在 snakemake 中实现一个非常简单的管道,希望用一个有凝聚力的 Snakefile 替换一系列烦人的 bash 脚本。
我在编写将文件拆分成更小的部分(使用 GNU 拆分)然后导致将输出连接在一起的第二条规则时遇到问题。
我不知道在 concat 步骤中为输入写什么,因为我不知道如何定义所有符合模式的文件 bam_files/test*
。我尝试使用 glob,但这显然不起作用(看起来它实际上是在跳过包含 glob 的拆分)。有没有更好的方法可以做到这一点?
# test snakemake pipeline
import glob
SAMPLE_IDS = ["test"]
rule all:
input:
expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)
rule split:
input:
expand("{FASTQ}.txt", FASTQ=SAMPLE_IDS)
output:
"bam_files/{FASTQ}."
shell:
"cat {input} | split -l 1000 -d - {output}."
rule concat:
input:
split_files = glob.glob("bam_files/{FASTQ}.*")
output:
"bam_files/{FASTQ}.out"
shell:
"cat {input} > {output}"
我认为这应该可行:
SAMPLE_IDS = ["test"]
rule all:
input:
expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)
rule split:
input:
"{FASTQ}.txt"
output:
dynamic("bam_files/{FASTQ}.{PART}")
params:
length=1000
shell:
"cat {input} | split -l {params.length} -d - bam_files/{FASTQ}."
rule concat:
input:
split_files = dynamic("bam_files/{FASTQ}.{PART}")
output:
"bam_files/{FASTQ}.out"
shell:
"cat {input} > {output}"
看起来 split
规则应该一次获取一个文件 {FASTQ}.txt
并生成 {FASTQ}.1, {FASTQ}.2, ...
或类似的东西。因为您事先不知道它会产生多少文件,所以您需要对 split.output
和 concat.input
.
dynamic()