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中遇到的第一个问题,并试图检查所有现有问题。请,如果这个问题听起来很愚蠢或者已经被回答了,请对我好:-)
答案 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。以获得更适当的解释。