在Snakemake中将无法预见的文件名包含为通配符

时间:2019-11-07 10:43:09

标签: snakemake

gdc-fastq-splitter将FASTQ文件分成读取组。例如,如果在dummy.fq.gz中包含3个不同的读取组,则将生成三个fastq文件:dummy_readgroup_1.fq.gz,dummy_readgroup_2.fq.gz,dummy_readgroup_3.fq.gz。鉴于每个原始FASTQ文件都位于不同的文件夹中,并且包含不同数量的读取组,因此在接下来的步骤中无法轻松将生成的文件作为通配符输入。

考虑到我不知道所得文件的确切名称和数量,是否有办法将一个规则的输出作为下一个规则的通配符? 一种替代方法是列出所有生成的文件,并在并行Snakefile中作为列表提供。我希望有一个更优雅的解决方案。

这是我在StackOverflow中遇到的第一个问题,并试图检查所有现有问题。请,如果这个问题听起来很愚蠢或者已经被回答了,请对我好:-)

1 个答案:

答案 0 :(得分:0)

这不是最漂亮的,但这是需要完成的方式:

import random
import glob
from pathlib import Path


SAMPLES = ['dummy', 'dommy']
rule all:
    input:
        [f"do_all_{sample}.out" for sample in SAMPLES]


def aggregate(wildcards):
    checkpoints.fastq_splitter.get(sample=wildcards.sample)
    read_groups = glob_wildcards(f"{wildcards.sample}_{{read_group}}.fastq.gz").read_group
    return [f"bam/{wildcards.sample}_{read_group}.bam" for read_group in read_groups]


rule do_everything:
    input:
        aggregate
    output:
        touch("do_all_{sample}.out")


rule do_sth_splitted:
    input:
        "{sample}_{read_group}.fastq.gz"
    output:
        touch("bam/{sample}_{read_group}.bam")



checkpoint fastq_splitter:
    input:
        "{sample}.fastq.gz"
    output:
        touch("{sample}.done")
    run:
        for i in range(random.randint(1, 5)):
            Path(f'{wildcards.sample}_{i}.fastq.gz').touch()

在运行之前,请确保示例文件存在:touch d{u,o}mmy.fastq.gz

checkpoint fastq_splitter中,我们生成随机数量的“ fastq”文件。我们假装rule do_sth_splitted,将其与基因组对齐,并为每个阅读组得到一个bam文件。 rule do_everything可以检查checkpoint fastq_splitter的输出,并且仅在fastq_splitter完成后进行评估。 rule all可以确保所有示例都运行正常。

看看checkpoints。以获得更适当的解释。