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

Python 向工作流添加通配符--最佳实践,python,snakemake,Python,Snakemake,我有一个相当复杂的snakemake生物信息学工作流程,包含超过200条规则。它基本上是从一组FASTQ文件开始的,从中可以推断变量,如下所示: (WC1, WC2, WC3, WC4) = glob_wildcards(FASTQPATH + "{wc1}_{wc2}_{wc3}_{wc4}.fastq.gz") 然后将它们展开以生成目标文件,例如(为了简洁起见,我跳过了中间规则): 在项目过程中,元数据可能会不断发展,需要添加通配符,例如wc5: (WC1, WC2, WC3, WC4,

我有一个相当复杂的snakemake生物信息学工作流程,包含超过200条规则。它基本上是从一组FASTQ文件开始的,从中可以推断变量,如下所示:

(WC1, WC2, WC3, WC4) = glob_wildcards(FASTQPATH + "{wc1}_{wc2}_{wc3}_{wc4}.fastq.gz") 
然后将它们展开以生成目标文件,例如(为了简洁起见,我跳过了中间规则):

在项目过程中,元数据可能会不断发展,需要添加通配符,例如
wc5

(WC1, WC2, WC3, WC4, WC5) = glob_wildcards(FASTQPATH + "{wc1}_{wc2}_{wc3}_{wc4}_{wc5}.fastq.gz") 
这将导致手动编辑约200条工作流规则以符合新输入。我想知道社区中是否有人想出了一个更优雅、更省力的解决方案(也许是使用输入函数?),或者这只是我们都不得不面对的一个障碍限制


提前感谢

我有一个芯片序列数据的工作流程,我的fastq文件的命名格式是MARK_tissure_REPLICATE.fastq.gz,例如H3K4me3_Liver_B.fastq.gz。对于我的许多规则,我不需要为标记、组织和复制使用单独的通配符。我可以这样写我的规则:

rule example:
    input: "{library}.fq.gz"
    output: "{library}.bam"
然后,对于需要有多个输入的规则,可能需要通过复制组合在一起,或者需要跨所有组织执行某些操作,我有一个称为“库”的函数,它返回具有特定条件的库列表。例如,库(mark=“H3K4me3”)将返回该标记的所有库,或者库(tissure=“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)
这种改变为或多或少的通配符的方式相对容易

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

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)