【发布时间】:2020-04-23 14:57:01
【问题描述】:
说,我从一堆这样的文件开始:
group_1_in.txt, group_2_in.txt, group_3_in.txt
我使用生成如下所示目录结构的规则来处理它们。
rule process_group_files:
input: 'group_{num}_in.txt'
output: directory('group_{num}')
shell: "some_command {input} {output}'
## directory structure produced:
group_1
sample1_content.txt
sample2_content.txt
sample3_content.txt
group_2
sample2_content.txt
sample3_content.txt
sample4_content.txt
group_3
sample1_content.txt
sample2_content.txt
sample5_content.txt
然后,我有规则处理它们以按样本聚合文件:
rule aggregate_by_sample:
input: expand('{group}/{sample}_content.txt')
output: '{sample}_allcontent.txt'
shell: "cat {input} | some_command > {output}"
我希望这条规则的输入是:
group_1/sample1_content.txt, group_3/sample1_content.txt
group_1/sample2_content.txt, group_2/sample2_content.txt, group_3/sample2_content.txt
group_1/sample3_content.txt, group_2/sample3_content.txt
group_2/sample4_content.txt
group_3/sample5_content.txt
并生成以下输出文件:
sample1_allcontent.txt
sample2_allcontent.txt
sample3_allcontent.txt
sample4_allcontent.txt
sample5_allcontent.txt
此时,我想使用这些输出文件。所以,这个规则可以是这样的:
rule process_by_sample:
input: <list of all sample_allcontent files>
output: final_output.txt
shell: "cat {input} | some_other_command > {output}"
我的问题是:我如何告诉snakemake 等到它处理完aggregate_by_sample 规则中的所有文件,然后将那组输出文件用于规则process_by_sample? 我通过将aggregate_by_sample 设为检查点来探索检查点的概念,但我应该使用“目录”作为输出,因为我不知道先验会生成多少个输出文件。但我不能这样做,因为我的输出文件名使用通配符,并且snakemake 抱怨Wildcards in input files cannot be determined from output files。
编辑 -- 在看到@troy-comi 的回答后,我意识到我过度简化了我的问题。我更新了我的问题以包含第一条规则process_group_files。我在管道开始时只知道我有多少组以及“数字”通配符列表是什么。
【问题讨论】: