Я хотел бы запустить команду (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