thực thi có điều kiện các quy tắc solidmake dựa trên cột trong metatable

Jan 15 2021

Tôi đang cố gắng sử dụng một cột trong tệp văn bản để thực thi có điều kiện các quy tắc trong quy trình làm việc của rắn.

Tệp văn bản như sau:

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

Đối với mỗi mẫu trong tệp văn bản, nếu cột giá trị ở cuối được ghép nối, tôi muốn sử dụng quy tắc cp_fastq_pe và nếu kết thúc là đơn lẻ thì tôi muốn sử dụng quy tắc cp_fastq_pe để xử lý các tệp fq1 & fq2 hoặc chỉ fq1 tương ứng.

phần có liên quan của Snakefile như sau:

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

có khả năng làm cái này không?

Trả lời

2 DmitryKuzminov Jan 15 2021 at 14:54

Tôi đã gặp sự cố tương tự mà tôi đã giải quyết ở đây: Làm cách nào để đặt đầu vào Snakemake là tùy chọn nhưng không trống?

Đây là ý tưởng được điều chỉnh cho vấn đề của bạn. Trước tiên, bạn cần chỉ định ruleorderđể giải quyết sự không rõ ràng (nếu không thì đơn lẻ luôn có thể được áp dụng bất cứ khi nào có thể ghép nối):

ruleorder: cp_fastq_pe > cp_fastq_se

Tiếp theo, trong cp_fastq_pequy tắc của bạn, bạn cần xác định một hàm trả về tệp hợp lệ (đối với trường hợp được ghép nối) hoặc trả về trình giữ chỗ cho tệp không tồn tại:

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"

Quy tắc này sẽ được áp dụng cho tất cả các mẫu bất cứ nơi nào "fq2"trường tồn tại và đại diện cho một tệp hợp lệ. Quy tắc khác sẽ được chọn cho phần còn lại của các mẫu.