неизвестный выход в змейке - PullRequest
0 голосов
/ 01 октября 2018

Я работаю над реализацией очень простого конвейера в snakemake в надежде заменить цепочку надоедливых скриптов bash одним связным Snakefile.

У меня проблемы с написанием правила, которое разбивает файл на более мелкие части (используя GNU split), а затем приводит ко второму правилу, где вывод объединяется вместе.

Я не знаю, что написать для ввода в шаге concat, так как я не знаю, как определить все файлы, соответствующие шаблону bam_files/test*.Я попробовал с glob, но это определенно не работает (кажется, что он фактически пропускает разделение вместе с включенным glob).Есть ли лучший способ, которым я мог бы сделать это?

# test snakemake pipeline
import glob


SAMPLE_IDS = ["test"]

rule all: 
    input: 
        expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)


rule split: 
    input: 
        expand("{FASTQ}.txt", FASTQ=SAMPLE_IDS)
    output: 
        "bam_files/{FASTQ}."
    shell:
        "cat {input} | split -l 1000 -d - {output}."


rule concat: 
    input:
        split_files = glob.glob("bam_files/{FASTQ}.*")
    output: 
        "bam_files/{FASTQ}.out"
    shell: 
        "cat {input} > {output}"

1 Ответ

0 голосов
/ 02 октября 2018

Я думаю, что это должно сработать:

SAMPLE_IDS = ["test"]

rule all: 
    input: 
        expand("bam_files/{FASTQ}.out", FASTQ=SAMPLE_IDS)


rule split: 
    input: 
        "{FASTQ}.txt"
    output: 
        dynamic("bam_files/{FASTQ}.{PART}")
    params:
        length=1000
    shell:
        "cat {input} | split -l {params.length} -d - bam_files/{FASTQ}."


rule concat: 
    input:
        split_files = dynamic("bam_files/{FASTQ}.{PART}")
    output: 
        "bam_files/{FASTQ}.out"
    shell: 
        "cat {input} > {output}"

Похоже, что правило split должно брать один файл {FASTQ}.txt за раз и производить {FASTQ}.1, {FASTQ}.2, ... или что-то подобное.Поскольку вы не знаете заранее, сколько файлов он будет производить, вам нужно использовать dynamic() для split.output и concat.input.

...