Snakemake SyntaxError при использовании каталога в качестве вывода - PullRequest
0 голосов
/ 24 августа 2018

Я хотел бы запустить команду (chipseq-greylist), которая выводит три файла каждый раз, когда она запускается с одним входным файлом. Имена выходных файлов автоматически выбираются командой. Пример:

chipseq-greylist --outdir out_dir A.bam

В этой строке будет три выходных файла: A-greystats.csv, A-greydepth.tsv and A-grey.bed. Я заинтересован в сборе всех *-grey.bed файлов в один каталог для последующего использования.

Поскольку это часть конвейера, который я использую для многих файлов, я использую Snakemake для обработки всех этих заданий. Я понимаю, что можно указать каталог в качестве выходного (https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#directories-as-outputs)), и это будет идеально соответствовать моим требованиям. Однако, когда я создал правило с каталогом в качестве выходного, я получаю SyntaxError.

from os.path import join

# Globals ---------------------------------------------------------------------

DIR = 'bowtie2/'

# A Snakemake regular expression matching BAM files.
SAMPLES, = glob_wildcards(join(DIR, '{sample,SRR\d+}_sorted_filtered.bam'))

# Rules -----------------------------------------------------------------------

rule all:
    input:
        expand("test/{sample}_sorted_filtered.bam.bai", sample=SAMPLES)

rule samtools_index:
    input:
        "bowtie2/{sample}_sorted_filtered.bam"
    output:
        "test/{sample}_sorted_filtered.bam.bai"
    log:
        "log/test/{sample}.log"
    shell:
        "samtools index {input} &> {log} > {output}"

rule greylist_call:
    input:
        "bowtie2/{sample}_sorted_filtered.bam"
    output:
        directory("greylist")
    log:
        "log/greylist/{sample}.log"
    shell:
        "chipseq-greylist --outdir {output} {input} &> {log}"

Обратите внимание, что в моем примере мне пришлось добавить еще один шаг, чтобы включить целевой файл для rule all. Это еще одна проблема Я нахожу с использованием directory(), поскольку не могу найти способ указать цель для rule all.

Я получаю ошибку:

SyntaxError: Not all output, log and benchmark files of rule greylist_call contain the same wildcards. This is crucial though, in order to avoid that two or more jobs write to the same file. File "Snakefile", line 34, in <module>

Я могу избавиться от сообщения об ошибке, если добавлю wildcards к имени выходного каталога в rule greylist_call.

from os.path import join

# Globals ---------------------------------------------------------------------

DIR = 'bowtie2/'

# A Snakemake regular expression matching the forward mate FASTQ files.
SAMPLES, = glob_wildcards(join(DIR, '{sample,SRR\d+}_sorted_filtered.bam'))

# Rules -----------------------------------------------------------------------

rule all:
    input:
        expand("test/{sample}_sorted_filtered.bam.bai", sample=SAMPLES)

rule samtools_index:
    input:
        "bowtie2/{sample}_sorted_filtered.bam"
    output:
        "test/{sample}_sorted_filtered.bam.bai"
    log:
        "log/test/{sample}.log"
    shell:
        "samtools index {input} &> {log} > {output}"

rule greylist_call:
    input:
        "bowtie2/{sample}_sorted_filtered.bam"
    output:
        directory("greylist_{sample}")
    log:
        "log/greylist/{sample}.log"
    shell:
        "chipseq-greylist --outdir {output} {input} &> {log}"

Тем не менее, я чувствую, что это противоречит цели иметь все файлы в одном и том же напрямую, и, хотя я мог бы потенциально обойти эту проблему, я все еще не могу найти способ заставить змея сделать это правило, так как я не могу указать целевой файл в rule all.

Буду признателен за любую помощь в использовании directory в snakemake или за любые другие предложения по улучшению этого набора правил.

Спасибо Anna

1 Ответ

0 голосов
/ 24 августа 2018

Я не понимаю, почему вы определяете папку как вывод.Snakemake не может определить, что ваша команда оболочки работает должным образом, если вы не предоставите реальные выходные файлы команды.Таким образом, если вы хотите создать все различные примеры файлов в одном каталоге, это можно сделать просто с помощью params:

rule greylist_call:
    input:
        "bowtie2/{sample}_sorted_filtered.bam"
    output:
        "output_dir/{sample}-greystats.csv",
        "output_dir/{sample}-greydepth.tsv",
        "output_dir/{sample}-grey.bed"
    params:
        outputDir = "output_dir"
    log:
        "log/greylist/{sample}.log"
    shell:
        "chipseq-greylist --outdir {params.outputDir} {input} &> {log}"

и, по вашему правилу all, добавьте:

expand("output_dir/{sample}-grey.bed", sample=SAMPLES)

Это создаст все файлы в одном каталоге.

Если вы хотите собрать все файлы постели в этом каталоге впоследствии в другом правиле, вы определите входные данные, например:

input:
    expand("output_dir/{sample}-grey.bed",sample=SAMPLES)

Чтобы объяснить ошибку, вы получаете: Подстановочные знаки определяются из выходных данных в правиле.Если вы запросите файл xxx.bed во всем правиле, snakemake найдет правило, которое имеет вывод, например {wildcard}.bed или сам файл xxx.bed.Как только правило найдено, snakemake сможет применять подстановочные знаки к входным данным, журналу, параметрам и т. Д. Подводя итог, вы не можете использовать подстановочный знак во входных данных, журнале или параметрах (или даже командах оболочки), если он не определенна выходе.Вот почему оно работало с вашим правилом, которое имело directory("greylist_{sample}") в качестве выходного события, хотя правило не работало так, как вы хотели!

...