मेटाटेबल में कॉलम के आधार पर सिन्केमेक नियमों का सशर्त निष्पादन

Jan 15 2021

मैं एक पाठ फ़ाइल में एक कॉलम का उपयोग करने की कोशिश कर रहा हूँ, जो कि एक snakemake वर्कफ़्लो में नियमों को निष्पादित करने के लिए है।

पाठ फ़ाइल इस प्रकार है:

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

पाठ फ़ाइल में प्रत्येक नमूने के लिए, यदि अंतिम कॉलम में मान है, तो मैं नियम cp_fastq_pe का उपयोग करना चाहूंगा और यदि अंत एकल है तो मैं क्रमशः fq1 & f22 या सिर्फ fq1 फ़ाइलों को संसाधित करने के लिए नियम cp_fastq_pe का उपयोग करना चाहूंगा।

स्नेकफाइल का प्रासंगिक भाग इस प्रकार है:

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

क्या इसे करना संभव है?

जवाब

2 DmitryKuzminov Jan 15 2021 at 14:54

मुझे इसी तरह की समस्या थी, जिसे मैंने यहां हल किया: शंकुमेक इनपुट को वैकल्पिक कैसे बनाया जाए, लेकिन खाली नहीं?

यहाँ आपकी समस्या के लिए समायोजित विचार है। सबसे पहले, आपको ruleorderअस्पष्टता को हल करने के लिए निर्दिष्ट करने की आवश्यकता है (अन्यथा जब भी संभव हो तो एकल हमेशा लागू किया जा सकता है):

ruleorder: cp_fastq_pe > cp_fastq_se

अगला, आपके cp_fastq_peनियम में आपको एक फ़ंक्शन को परिभाषित करने की आवश्यकता है जो या तो एक वैध फ़ाइल (युग्मित मामले के लिए) लौटाता है या गैर-मौजूदा फ़ाइल के लिए एक प्लेसहोल्डर देता है:

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"

यह नियम उन सभी नमूनों पर लागू होगा जहाँ "fq2"फ़ील्ड मौजूद है और एक मान्य फ़ाइल का प्रतिनिधित्व करता है। बाकी नमूनों के लिए अन्य नियम का चयन किया जाएगा।