eksekusi bersyarat dari aturan snakemake berdasarkan kolom di metatable

Jan 15 2021

Saya mencoba menggunakan kolom dalam file teks untuk menjalankan aturan secara bersyarat dalam alur kerja snakemake.

File teksnya adalah sebagai berikut:

id  end sample_name fq1 fq2
a   paired  test_paired resources/SRR1945436_1.fastq.gz resources/SRR1945436_2.fastq.gz
b   single  test_single resources/SRR1945436.fastq.gz   NA

Untuk setiap sampel dalam file teks, jika nilai di kolom akhir dipasangkan, saya ingin menggunakan aturan cp_fastq_pe dan jika akhir tunggal maka saya ingin menggunakan aturan cp_fastq_pe untuk memproses masing-masing file fq1 & fq2 atau hanya fq1.

bagian yang relevan dari Snakefile adalah sebagai berikut:

import pandas as pd
samples = pd.read_table("config/samples.tsv").set_index("id", drop=False)
all_ids=list(samples["id"])

rule cp_fastq_pe:
    """
    copy file to resources
    """
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"],
        fq2=lambda wildcards: samples.loc[wildcards.id, "fq2"]
    output:
        "resources/fq/{id}_1.fq.gz",
        "resources/fq/{id}_2.fq.gz"
    shell:
        """
        cp {input.fq1} {output[0]}
        cp {input.fq2} {output[1]}
        """

rule cp_fastq_se:
    """
    copy file to resources
    """
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"]
    output:
        "resources/fq/{id}.fq.gz",
    shell:
        """
        cp {input.fq1} {output}
        """

Apakah mungkin melakukan ini?

Jawaban

2 DmitryKuzminov Jan 15 2021 at 14:54

Saya memiliki masalah serupa, yang saya selesaikan di sini: Bagaimana cara membuat input Snakemake opsional tetapi tidak kosong?

Berikut idenya disesuaikan dengan masalah Anda. Pertama, Anda perlu menentukan ruleorderuntuk menyelesaikan ambiguitas (jika tidak, single selalu dapat diterapkan setiap kali pasangan memungkinkan):

ruleorder: cp_fastq_pe > cp_fastq_se

Selanjutnya, dalam cp_fastq_peaturan Anda, Anda perlu menentukan fungsi yang mengembalikan file yang valid (untuk kasus berpasangan) atau mengembalikan placeholder untuk file yang tidak ada:

rule cp_fastq_pe:
    input:
        fq1=lambda wildcards: samples.loc[wildcards.id, "fq1"],
        fq2=lambda wildcards: samples.loc[wildcards.id, "fq2"] if "fq2" in samples else "non-existing-filename"

Aturan ini akan diterapkan ke semua sampel di mana pun "fq2"bidang ada dan mewakili file yang valid. Aturan lainnya akan dipilih untuk sisa sampel.