Включение непредвиденных имен файлов в качестве символов подстановки в Snakemake - PullRequest
0 голосов
/ 07 ноября 2019

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 голосов
/ 08 ноября 2019

Это не самый красивый, но это способ, которым это нужно сделать:

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 существует, чтобы убедиться, что все запущено для всех образцов.

Взгляните на контрольные точки . для более правильного объяснения.

...