向工作流最佳实践添加通配符

2024-10-02 08:27:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个相当复杂的蛇形生物信息学工作流程,由>;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个工作流规则,以符合新的输入。我想知道社区中是否有人提出了一个更优雅、更简单的解决方案(也许使用输入函数?)或者这仅仅是一个我们都必须面对的障碍?你知道吗

提前谢谢


Tags: 文件规则globfastqgzwc1wc4wildcards
2条回答

我有一个用于ChIP seq数据的工作流,我的fastq文件以MARK\u格式命名_复制.fastq.gz例如H3K4me3\u Liver\u B。快速Q.gz. 对于我的许多规则,我不需要为标记、组织和复制使用单独的通配符。我可以这样写规则:

rule example:
    input: "{library}.fq.gz"
    output: "{library}.bam"

然后,对于需要有多个输入的规则,可能是通过复制组合在一起,或者在所有组织中执行某些操作,我有一个名为“libraries”的函数,它返回具有特定条件的库列表。例如,库(mark=“H3K4me3”)将返回该标记的所有库,或者库(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="[^_/]+_[^_/]+_[^_/]+"

希望您可以将这些想法应用到自己的工作流中。你知道吗

我认为@Colin在这里走的是正确的(最像蛇一样的)道路。但是,如果要使用通配符(例如在日志中)或它们指定某些参数,则可以尝试用变量替换通配符,并将其插入规则的输入和输出中:

metadata = "{wc1}_{wc2}_{wc3}_{wc4}"
WC1, WC2, WC3, WC4 = glob_wildcards(FASTQPATH + metadata + ".fastq.gz") 

rule map:
    input:
        expand(f"unmapped/{metadata}.fq")
    input:
        expand(f"mappings/{metadata}.fq")
    shell:
        """
        echo {wildcards.wc1};
        mv {input} {output}
        """

rule all:
    expand("mappings/{wc1}_{wc2}_{wc3}_{wc4}.bam", wc1=WC1, wc2=WC2, wc3=WC3, wc4=WC4)

这种改变为或多或少的通配符的方法相对容易。你知道吗

免责声明我还没有测试过这些方法是否有效:)

相关问题 更多 >

    热门问题