Первое правило (здесь rule all
) указывает файлы, которые вы хотели бы создать во время рабочего процесса snakemake.
Для данного файла, f
, в rule all::input
, snakemake просмотрит все правила и попытается найти то, которое может создать f
(на основе сопоставления с образцом в сегменте output
каждого правила) .
Предположим, f = raw/my_sample.bam
Как только snakemake
найдет правило, которое может создать f
, оно определит все входные файлы, необходимые для создания этого файла.
Итак, snakemake обнаруживает, что f = raw/my_sample.bam
может быть создан с помощью rule bwa_map
(поскольку f
соответствует шаблону raw/<anything>.bam
), а затем определяет, какие файлы необходимы для создания f
на основе сегмента input
.
Snakemake думает: я могу сделать raw/my_sample.bam
, если у меня есть
файл ref="/data/data/reference/refs/ucsc.hg19.fasta.gz"
файлы r1=expand("raw/{sample}_{read}.fastq.gz",sample=SAMPLES,read=READS)
и файлы r2=expand("raw/{sample}_{read}.fastq.gz",sample=SAMPLES,read=READS)
В expand
, r1
расширяет sample
до каждого значения в ОБРАЗЦАХ и read
до каждого значения в ЧИТАНИЯХ. Но у вас есть 10 значений в SAMPLES и 2 значения в READS, поэтому r1
расширяется до 20 различных путей к файлам для каждого выходного файла, который он пытается создать. Он игнорирует подстановочный знак sample
, присутствующий в предложении output
(поскольку вы перезаписали его в вызове expand
).
Необходимо разрешить использование подстановочных знаков, определенных в предложении вывода, до предложения ввода :
import os
import snakemake.io
import glob
(SAMPLES,READS,) = glob_wildcards("raw/{sample}_{read}.fastq.gz")
READS=["1","2"]
REF="/data/data/reference/refs/ucsc.hg19.fasta.gz"
rule all:
input: expand("raw/{sample}.bam",sample=SAMPLES)
rule bwa_map:
input:
ref=REF,
# determine `r1` based on the {sample} wildcard defined in `output`
# and the fixed value `1` to indicate the read direction
r1="raw/{sample}_1.fastq.gz",
# determine `r2` based on the {sample} wildcard similarly
r2="raw/{sample}_2.fastq.gz"
output: "raw/{sample}.bam"
# better to pass in the threads than to hardcode them in the shell command
threads: 8
shell: "bwa mem -M -t {threads} {input.ref} {input.r1} {input.r2} | samtools view -Sbh - > {output}"
Я бы посоветовал вам взглянуть на то, как правило для выравнивания bwa
записано в ресурсе обертки snakemake (вы также можете подумать об использовании обертки): https://snakemake -wrappers.readthedocs. -й / о / стабильный / упаковщики / BWA / mem.html
Не по теме: С точки зрения обзора кода я спрашиваю, почему вы выводите выровненные данные в каталог raw
? Имеет ли смысл выводить выровненные данные в align
или aligned
? Вы также, кажется, импортируете из пакетов, которые вы не используете.