如何获得执行M次以生成MxN文件的snakemake规则?

时间:2019-05-26 12:08:54

标签: snakemake

我正在将生物信息学管道转换为snakemake,并有一个脚本可以循环M个文件(每个非性别染色体M = 22)。

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

我可以通过仅在每个染色体上查找一个标签文件来解决该问题,但这与snakemake的精神不符,下一步,管线需要来自所有标签文件的输入。

我已经尝试过使用检查点功能(据我了解,在执行每个规则后重新评估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"

1 个答案:

答案 0 :(得分:1)

如果希望避免将脚本运行N次,则可以在输出中指定所有输出文件,但不使用通配符:

keep_list = ['not']
filtered_words = [word for word in lower_tokens if (word not in stopwords.words("english")) or (word in keep_list)]

要使代码更通用,可以使用 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