Проблема Snakemake: объединить все файлы вместе с разделителем пробела вместо повторения через него - PullRequest
0 голосов
/ 05 мая 2020

Я пытался запустить команду, которая в идеале выглядит так:

minimap2 -a -x map-ont -t 20 /staging/reference.fasta fastq/sample01.fastq | samtools view -bS -F 4 - | samtools sort -o fastq_minon/sample01.bam

Аналогично, у меня есть несколько образцов (имеется в виду fastq / sample01.fastq ) в папке.

Файл snakemake, который я написал для автоматизации этого поведения, однако, анализирует все файлы сразу в команде, например,

minimap2 -a -x map-ont -t 1 /staging/reference.fasta fastq/sample02.fastq fastq/sample03.fastq fastq/sample01.fastq | samtools view -bS -F 4 - | samtools sort -o fastq_minon/sample02.bam fastq_minon/sample03.bam fastq_minon/sample01.bam

Я вставил код и журналы ниже. Пожалуйста, помогите мне разобраться в этой ошибке.

Код

SAMPLES, = glob_wildcards("fastq/{smp}.fastq")
rule minimap:
    input:
        expand("fastq/{smp}.fastq", smp=SAMPLES)
    output:
        expand("fastq_minon/{smp}.bam", smp=SAMPLES)
    params:
        ref = FASTA
    threads: 40
    shell:
        """
        minimap2 -a -x map-ont -t {threads} {params.ref} {input} | samtools view -bS -F 4 - | samtools sort -o {output}
        """

журнал

Building DAG of jobs...
Job counts:
        count   jobs
        1       minimap
        1

[Tue May  5 03:28:50 2020]
rule minimap:
    input: fastq/sample02.fastq, fastq/sample03.fastq, fastq/sample01.fastq
    output: fastq_minon/sample02.bam, fastq_minon/sample03.bam, fastq_minon/sample01.bam
    jobid: 0


        minimap2 -a -x map-ont -t 1 /staging/reference.fasta fastq/sample02.fastq fastq/sample03.fastq fastq/sample01.fastq | samtools view -bS -F 4 - | samtools sort -o fastq_minon/sample02.bam fastq_minon/sample03.bam fastq_minon/sample01.bam

Job counts:
        count   jobs
        1       minimap
        1
This was a dry-run (flag -n). The order of jobs does not reflect the order of execution.

1 Ответ

2 голосов
/ 05 мая 2020

Функция expand используется для создания списка. Таким образом, в вашем правиле minimap вы говорите snakemake, что вам нужны все файлы fastq в качестве входных данных и что правило будет создавать столько же файлов BAM. Вам нужно правило, которое будет запускаться для каждого образца с использованием подстановочного знака:

SAMPLES, = glob_wildcards("fastq/{smp}.fastq")

rule all:
    input: expand("fastq_minon/{smp}.bam", smp=SAMPLES)

rule minimap:
    input:
        "fastq/{smp}.fastq"
    output:
        "fastq_minon/{smp}.bam"
    params:
        ref = FASTA
    threads: 40
    shell:
        """
        minimap2 -a -x map-ont -t {threads} {params.ref} {input} | samtools view -bS -F 4 - | samtools sort -o {output}
        """

Определив все файлы, которые требуются в правиле all, правило minimap будет срабатывать столько раз, сколько необходимо для создания ОДНОГО файла bam из ОДНОГО файла fastq.

Посмотрите мой ответ на этот вопрос , чтобы понять использование подстановочных знаков и расширения.

...