Skip to main content
 首页 » 编程设计

python之将通配符添加到工作流程——最佳实践

2024年09月03日17kerrycode

我有一个非常复杂的 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="[^_/]+_[^_/]+_[^_/]+" 

希望您可以将其中一些想法应用到您自己的工作流程中。