snakemake中的输出未知

时间:2018-10-01 20:43:43

标签: bioinformatics snakemake

我正在努力在snakemake中实现一个非常简单的管道,以期用一个内聚的Snakefile替换一连串烦人的bash脚本。

我在编写将文件分割成较小的规则(使用GNU split),然后导致输出连接在一起的第二条规则时遇到了麻烦。

我不知道在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}"

1 个答案:

答案 0 :(得分:2)

我认为这应该可行:

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, ...或类似内容。因为您不提前知道它将产生多少个文件,所以您需要对dynamic()split.output使用concat.input