metatable'daki sütuna göre snakemake kurallarının koşullu uygulaması

Jan 15 2021

Snakemake iş akışında kuralları koşullu olarak yürütmek için bir metin dosyasında bir sütun kullanmaya çalışıyorum.

Metin dosyası aşağıdaki gibidir:

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

Metin dosyasındaki her örnek için, son sütundaki değer eşleştirilmişse, cp_fastq_pe kuralını kullanmak isterim ve eğer son tek ise, sırasıyla fq1 & fq2 veya sadece fq1 dosyalarını işlemek için cp_fastq_pe kuralını kullanmak isterim.

Snakefile'ın ilgili bölümü aşağıdaki gibidir:

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}
        """

Bunu yapmak mümkün mü?

Yanıtlar

2 DmitryKuzminov Jan 15 2021 at 14:54

Burada çözdüğüm benzer bir problem yaşadım: Snakemake girişi nasıl isteğe bağlı yapılır ama boş bırakılmaz?

İşte probleminize uyarlanmış fikir. İlk olarak, ruleorderbelirsizliği çözmek için belirtmeniz gerekir (aksi takdirde single, eşleştirme mümkün olduğunda her zaman uygulanabilir):

ruleorder: cp_fastq_pe > cp_fastq_se

Daha sonra, cp_fastq_pekuralınızda , geçerli bir dosya döndüren (eşleştirilmiş durum için) veya var olmayan dosya için bir yer tutucu döndüren bir işlev tanımlamanız gerekir:

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"

Bu kural, "fq2"alanın mevcut olduğu ve geçerli bir dosyayı temsil ettiği her yerde tüm örneklere uygulanacaktır . Diğer kural, numunelerin geri kalanı için seçilecektir.