我正在将生物信息学管道转换为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"
答案 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