【问题标题】:Snakemake unknown number of output files / defining wildcards based on intermediate filesSnakemake 未知数量的输出文件/根据中间文件定义通配符
【发布时间】:2021-01-13 23:10:42
【问题描述】:

为了加快我的工作流程,我想做类似于snakemake-unknown-output-input-files-after-splitting-by-chromosome的事情

SAMPLE = "sample_a"

rule all:
    expand("results/{sample}-final-combined.bam", sample=SAMPLE)


rule exclude_blacklist:
    input:
        region_file = "data/{sample}.bed",
        blacklist = "data/blacklists/universal_blacklist.bed"
    output:
        "results/{sample}_blacklist-excluded.bed"
    shell:
        """
        bedtools intersect -v -a {input.region_file} -b {input.blacklist} > {output}
        """

rule target_regions_by_chrom:
    input:
        region_file ="results/{sample}_blacklist-excluded.bed",
    output:
        temp("results/{sample}_{chrom}.bed")
    script:
        "scripts/split_region_by_chrom.py"

rule simulate_reads:
    input:
        "results/{sample}_{chrom}.bed"
    output:
        "results/{sample}_{chrom}.bam"
    script:
        "scripts/simulate_reads.py"

rule combine_regions_again:
    input:
        files = expand("results/{sample}_{chrom}.bam", sample=SAMPLE, chrom=get_chroms())
    output:
        "results/{sample}-final-combined.bam"
    script:
        "scripts/combine_bams.py"

工作流程应该获取一个带有未过滤区域的 .bed 文件,从黑名单中排除有问题的区域,按染色体拆分过滤后的 .bed 文件,然后模拟这些区域的读取(为简单起见,我不详细说明),生成 .bam文件。最终,这些 .bam 文件应该再次组合成一个输出文件。

主要问题是如何预先解决未知数量的染色体。如果我输入 .bed 文件,我会收到一些错误,因为有些文件是空的。我曾考虑在排除黑名单区域后使用输入函数(此处为 get_chroms())从输出 .bed 文件(“results/{sample}_blacklist-excluded.bed”)中恢复染色体,但这会导致在由于文件不存在而创建 DAG。

是否有人对如何解决这些问题有任何建议:

  1. 按染色体拆分 .bed 文件,但不知道当前的染色体
  2. 根据工作流中的中间文件定义通配符

任何帮助将不胜感激!

【问题讨论】:

    标签: python split wildcard snakemake


    【解决方案1】:

    Snakemake 的Dynamic Files 功能可能正是你所需要的:

    只要有一个规则,就可以使用动态文件 在执行规则之前,输出文件的数量是未知的。

    您应该将 "results/{sample}_{chrom}.bed"dynamic() 修饰符包装在输入和输出对应项中:

    rule target_regions_by_chrom:
        output:
            dynamic("results/{sample}_{chrom}.bed")
    
    rule simulate_reads:
        input:
            dynamic("results/{sample}_{chrom}.bed")
    

    【讨论】:

    • 解决了一些后续通配符错误后,这是最简单的解决方案。
    猜你喜欢
    • 1970-01-01
    • 2022-12-17
    • 1970-01-01
    • 2018-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多