【问题标题】:How do I get a snakemake rule to execute M times to generate MxN files?如何获得一条蛇形规则来执行 M 次以生成 MxN 文件?
【发布时间】:2019-05-26 12:08:54
【问题描述】:

我正在将生物信息学管道转换为蛇形,并有一个循环遍历 M 个文件的脚本(其中每个非性染色体 M=22)。

每个文件本质上都包含我想要作为单个文件的 N 个标签列。 python脚本可靠地做到了这一点,我的问题是,如果我为输出(染色体和标签)提供带有通配符的snakefile,它将运行脚本MxN次,而我只希望它运行M次。

我可以通过只为每个染色体寻找一个标签文件来规避这个问题,但这不符合蛇形的精神,并且管道中的下一步需要来自所有标签文件的输入。

我已经尝试使用检查点功能(据我了解,在执行每个规则后重新评估 DAG)来检查输出,了解已生成 N 个文件并跳过 N 个作业。但这崩溃了,我得到了this error。但是因为我事先知道我的标签,据我所知,我不应该需要检查点/动态 - 我只是不知道我到底需要什么。

是否可以禁用通配符生成作业并仅检查输出是否返回?

LABELS = ['A', 'B', 'C', 'D']
CHROMOSOMES = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22] 

rule all:
    input:
        "out/final.txt"

rule split_files: 
    '''
    Splits the chromosome files by label.
    '''
    input:
        "per_chromosome/myfile.{chromosome}.txt"
    output:
        "per_label/myfile.{label}.{chromosome}.txt"
    script:
        "scripts/split_files_snake.py"

rule make_out_file:
    '''
    Makes the final output file by checking each of label.chromosome files one-by-one
    '''
    input:
        expand("per_label/myfile.{label}.{chromosome}",
            label=LABELS,
            chromosome=CHROMOSOMES)
    output:
        "out/final.txt"
    script:
        "scripts/make_out_file_snake.py"

【问题讨论】:

    标签: snakemake


    【解决方案1】:

    如果您希望避免脚本运行 N 次,您可以在输出中指定所有不带通配符的输出文件:

        output:
            "per_label/myfile.A.{chromosome}.txt",
            "per_label/myfile.B.{chromosome}.txt",
            "per_label/myfile.C.{chromosome}.txt",
            "per_label/myfile.D.{chromosome}.txt"
    

    为了使代码更通用,您可以使用expand 函数,但要特别注意格式字符串中的大括号:

        output:
            expand("per_label/myfile.{label}.{{chromosome}}.txt", label=LABELS)
    

    【讨论】:

    • 成功了!非常感谢,这让我整个星期都很沮丧。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-18
    • 1970-01-01
    • 2016-08-22
    • 2012-06-05
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    相关资源
    最近更新 更多