Snakemake, как изменить имя выходного файла при использовании подстановочных знаков - PullRequest
1 голос
/ 09 ноября 2019

Я думаю, что у меня есть простая проблема, но я не знаю, как ее решить.

Моя входная папка содержит такие файлы:

AAAAA_S1_R1_001.fastq
AAAAA_S1_R2_001.fastq
BBBBB_S2_R1_001.fastq
BBBBB_S2_R2_001.fastq

Мой код змейки:

import glob

samples = [os.path.basename(x) for x in sorted(glob.glob("input/*.fastq"))]
name = []
for x in samples:
    if "_R1_" in x:
        name.append(x.split("_R1_")[0])
NAME = name

rule all:
    input:
        expand("output/{sp}_mapped.bam", sp=NAME),

rule bwa:
    input:
        R1 = "input/{sample}_R1_001.fastq",
        R2 = "input/{sample}_R2_001.fastq"
    output:
        mapped = "output/{sample}_mapped.bam"
    params:
        ref = "refs/AF086833.fa"
    run:
        shell("bwa mem {params.ref} {input.R1} {input.R2} | samtools sort > {output.mapped}")

Имена выходных файлов:

AAAAA_S1_mapped.bam
BBBBB_S2_mapped.bam

Я хочу, чтобы выходной файл был:

AAAAA_mapped.bam
BBBBB_mapped.bam

Как можно или изменить имя вывода или переименовать файлы доили после правила бва.

1 Ответ

1 голос
/ 09 ноября 2019

Попробуйте это:

import pathlib

indir = pathlib.Path("input")
paths = indir.glob("*_S?_R?_001.fastq")
samples = set([x.stem.split("_")[0] for x in paths])

rule all:
    input:
        expand("output/{sample}_mapped.bam", sample=samples)


def find_fastqs(wildcards):
    fastqs = [str(x) for x in indir.glob(f"{wildcards.sample}_*.fastq")]
    return sorted(fastqs)


rule bwa:
    input:
        fastqs = find_fastqs
    output:
        mapped = "output/{sample}_mapped.bam"
    params:
        ref = "refs/AF086833.fa"
    shell:
        "bwa mem {params.ref} {input.fastqs} | samtools sort > {output.mapped}"

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

(отредактировано, чтобы отразить редактирование OP.)

...