【问题标题】:Combination of inputs in the snakemake shell scriptsnakemake shell 脚本中的输入组合
【发布时间】:2020-03-25 17:24:50
【问题描述】:

我有以下 bash 脚本,我想将其转换为蛇文件:

mmseqs rbh flye_db megahit_db flye_megahit_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12
mmseqs rbh flye_db metaspades_db flye_metaspades_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12
mmseqs rbh megahit_db metaspades_db megahit_metaspades_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12

我想出了以下方法,但想知道是否有办法使用正则表达式或扩展来进一步改进代码:

rule mmseq2_compare:
    input:
        mm1=expand(os.path.join(RESULTS_DIR, "annotation/mmseq2/{assembler}_db"), assembler="flye"),
        mm2=expand(os.path.join(RESULTS_DIR, "annotation/mmseq2/{assembler}_db"), assembler="megahit"),
        mm3=expand(os.path.join(RESULTS_DIR, "annotation/mmseq2/{assembler}_db"), assembler="metaspades_hybrid")
    output: 
        mo1=os.path.join(RESULTS_DIR, "annotation/mmseq2/flye_megahit_rbh"),
        mo2=os.path.join(RESULTS_DIR, "annotation/mmseq2/flye_metaspades_hybrid_rbh"),
        mo3=os.path.join(RESULTS_DIR, "annotation/mmseq2/megahit_metaspades_hybrid_rbh")
    log: os.path.join(RESULTS_DIR, "annotation/mmseq2/compare.mmseq2.log")
    conda: "cd-hit.yml"
    shell:
        """
        (date &&\
        mmseqs rbh {input.mm1} {input.mm2} {output.mo1} --min-seq-id 0.9 mmseq2_tmp --threads 12 &&\
        mmseqs rbh {input.mm1} {input.mm3} {output.mo2} --min-seq-id 0.9 mmseq2_tmp --threads 12 &&\
        mmseqs rbh {input.mm2} {input.mm3} {output.mo3} --min-seq-id 0.9 mmseq2_tmp --threads 12 &&\
        date) &> >(tee {log})
        """

对于 3 个汇编器(flye、megahit 和 metaspades_hybrid),有什么方法可以消除冗余,尤其是在“shell”中?

谢谢!

试运行输出

Building DAG of jobs...
Job counts:
        count   jobs
        1       all
        1       mmseq_compare
        2

[Thu Mar 26 12:25:14 2020]
rule mmseq_compare:
    input: results/annotation/mmseq2/flye_db, results/annotation/mmseq2/megahit_db
    output: results/annotation/mmseq2/flye_megahit_rbh
    jobid: 1
    wildcards: assembler1=flye, assembler2=megahit

mmseqs rbh results/annotation/mmseq2/flye_db results/annotation/mmseq2/megahit_db results/annotation/mmseq2/flye_megahit_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12

[Thu Mar 26 12:25:14 2020]
localrule all:
    input: results/annotation/mmseq2/flye_megahit_rbh, results/annotation/mmseq2/flye_metaspades_hybrid_rbh, results/annotation/mmseq2/megahit_metaspades_hybrid_rbh
    jobid: 0

Job counts:
        count   jobs
        1       all
        1       mmseq_compare
        2
This was a dry-run (flag -n). The order of jobs does not reflect the order of execution.```

【问题讨论】:

    标签: python shell wildcard snakemake


    【解决方案1】:

    首先,您的输入中不需要expand。如果您希望创建具有相同模式的文件名列表,则需要这样做。

    接下来,只要您已经在路径中使用了 Unix 类型的斜杠,您就可以将 RESULTS_DIR 添加到 f 字符串中以提高可读性(但不要忘记将大括号加倍作为通配符)。

    最后,没有必要用 && 分隔脚本管道:这就是 Snakemake 的设计目的。

    我修改后的脚本版本:

    rule all:
        input:
            expand(f"{RESULTS_DIR}/annotation/mmseq2/{{assembler1}}__{{assembler2}}_rbh", zip,
                   assembler1=["flye", "flye", "megahit"],
                   assembler2=["megahit", "megahit_metaspades_hybrid", "megahit_metaspades_hybrid"])
    
    rule mmseq_compare:
        input:
            f"{RESULTS_DIR}/annotation/mmseq2/{{assembler1}}_db",
            f"{RESULTS_DIR}/annotation/mmseq2/{{assembler2}}_db"
        output: 
            f"{RESULTS_DIR}/annotation/mmseq2/{{assembler1}}__{{assembler2}}_rbh"
        conda:
            "cd-hit.yml"
        shell:
            "mmseqs rbh {input[0]} {input[1]} {output} --min-seq-id 0.9 mmseq2_tmp --threads 12"
    

    我已排除 date 和日志记录。我的解决方案有一个限制,即比较的执行顺序未定义:在这种情况下,您需要重新考虑日志记录策略。

    【讨论】:

    • 谢谢你。几个问题: 1. 行首的“f”是做什么的? 2. 当我进行试运行时,它只构建这个文件 - mmseqs rbh results/annotation/mmseq2/flye_db results/annotation/mmseq2/megahit_db results/annotation/mmseq2/flye_megahit_rbh --min-seq-id 0.9 mmseq2_tmp --threads 12。其他组合 flye_metaspades_hybrid 和 megahit_metaspades_hybrid 没有被打印。知道为什么吗?
    • f-string 允许您将简单的表达式嵌入到字符串中(将替换为表达式评估的结果)。在这种情况下,在字符串 f"{RESULTS_DIR}/annotation" 中,{RESULTS_DIR} 将被替换为可验证的实际值。关于试运行:请提供试运行的全部输出。
    • 谢谢.. 我已经用空运行输出更新了这个问题。抱歉,我不小心将空运行输出添加到您的答案中。请删除!
    • @SusheelBusi 我已经更新了我的答案。一个额外的下划线解决了这个问题。然而,这对我来说似乎是一个错误,即 Snakemake 与没有双下划线的可能组合不匹配。我会调查这个问题。
    • 双下划线可能修复了来自带有下划线的无约束正则表达式的通配符中的一些歧义。我对输出感到惊讶,我认为它会因找不到输入或类似内容而引发异常。您可以对汇编程序使用驼峰式大小写,也可以在通配符或文件名 (-) 中使用其他分隔符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    • 2019-09-16
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多