我有一个非常复杂的 snakemake 生物信息学工作流程,其中包含 >200 条规则。它基本上从一组 FASTQ 文件开始,从中推断出变量,如下所示:
(WC1, WC2, WC3, WC4) = glob_wildcards(FASTQPATH + "{wc1}_{wc2}_{wc3}_{wc4}.fastq.gz")
然后将这些扩展以生成目标文件,例如(为简洁起见,我跳过了中间规则):
rule all:
expand("mappings/{wc1}_{wc2}_{wc3}_{wc4}.bam", wc1=WC1, wc2=WC2, wc3=WC3, wc4=WC4),
在一个项目的过程中,元数据会发生变化,需要添加通配符,例如wc5:
(WC1, WC2, WC3, WC4, WC5) = glob_wildcards(FASTQPATH + "{wc1}_{wc2}_{wc3}_{wc4}_{wc5}.fastq.gz")
这导致手动编辑约 200 条工作流规则以符合新输入。我想知道社区中是否有人提出了更优雅、更简单的解决方案(也许使用输入功能?),或者这只是我们都必须忍受的 Snakemake 限制?
提前致谢
请您参考如下方法:
我有一个 ChIP-seq 数据工作流程,我的 fastq 文件以 MARK_TISSUE_REPLICATE.fastq.gz 格式命名,例如 H3K4me3_Liver_B.fastq.gz。对于我的许多规则,我不需要为标记、组织和复制设置单独的通配符。我可以这样写我的规则:
rule example:
input: "{library}.fq.gz"
output: "{library}.bam"
然后对于我需要有多个输入的规则,可能通过复制组合在一起或在所有组织中做某事,我有一个我称为“库”的函数,它返回具有特定条件的库列表。例如 libraries(mark="H3K4me3") 将返回该标记的所有库,或者 libraries(tissue="Liver", replicate="A") 将返回该特定组织样本中所有标记的库。我可以用它来编写需要组合多个库的规则,例如:
rule example2:
input: lambda wildcards: expand("{library}.bam", library=libraries(mark=wildcards.mark))
output: "{mark}_Heatmap_Clustering.png"
为了解决一些奇怪或模棱两可的规则问题,我发现像这样设置一些通配符约束很有帮助:
wildcard_constraints:
mark="[^_/]+",
tissue="[^_/]+",
replicate="[^_/]+",
library="[^_/]+_[^_/]+_[^_/]+"
希望您可以将其中一些想法应用到您自己的工作流程中。
