Мой обычный способ прокладки трубок, частично основанный на этом сообщении Biostars , следующий:
rule map:
input: "{sample}.fq.gz",
output: "sort/{sample}.bam"
threads: 24
shell:
"""
bwa mem reference.fa {input} \
-t {threads} | \
samtools sort - \
-@ {threads} \
-o {output}
"""
Я очень хотел попробовать трубки Snakemake, так как я надеялся, что они могут сделать рабочие процессы с несколькими каналами более удобочитаемыми.
rule map:
input: "{sample}.fq.gz",
output: pipe("{sample}.bam")
threads: 24
shell:
"""
bwa mem reference.fa {input} \
-t {threads} \
> {output}
"""
rule sort:
input: "{sample}.bam"
output: "sort/{sample}.bam"
threads: 24
shell:
"""
samtools sort {input} -@ {threads} -o {output}
"""
Однако это приводит к следующему WorkflowError: Job needs threads=48 but only threads=24 are available. This is likely because two jobs are connected via a pipe and have to run simultaneously. Consider providing more resources (e.g. via --cores).
Итак, мне нужно разделить потоки между bwa и samtools, но выделить потоки для samtools означает удаление потоков из bwa, и я бы предпочел не делать этого. Эта проблема станет более заметной в рабочих процессах с несколькими шагами трубопроводов.
Я не видел, чтобы трубы Snakemake использовались так часто, но мне интересно, знает ли кто-нибудь обходной путь? Я также собираюсь поднять это как проблему на странице Snakemake Github.
Также общий вопрос о каналах. Есть ли у Snakemake веская причина для выделения отдельных потоков процессам в конвейере? Стоит ли мне беспокоиться о том, что как bwa, так и samtools используют 24 потока в моем обычном способе подключения?