Это не самый красивый, но это способ, которым это нужно сделать:
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
существует, чтобы убедиться, что все запущено для всех образцов.
Взгляните на контрольные точки . для более правильного объяснения.