【问题标题】:unknown output in snakemakesnakemake 中的未知输出
【发布时间】:2018-10-01 20:43:43
【问题描述】:

我正致力于在snakemake 中实现一个非常简单的管道,希望用一个有凝聚力的Snakefile 替换一系列烦人的bash 脚本。

我在编写将文件拆分为较小部分的规则时遇到问题(使用 GNU 拆分),然后导致输出连接在一起的第二条规则。

我不知道在 concat 步骤中为输入写什么,因为我不知道如何定义所有适合模式 bam_files/test* 的文件。我尝试使用 glob,但这显然不起作用(看起来它实际上是在包含 glob 的情况下完全跳过 split )。有没有更好的方法可以做到这一点?

# 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}"

【问题讨论】:

  • 你看过dynamic()吗? Source

标签: bioinformatics snakemake


【解决方案1】:

我认为这应该可行:

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.outputconcat.input都使用dynamic()

【讨论】:

    猜你喜欢
    • 2022-01-04
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多