【问题标题】:How to ensure snakemake rule dependency while submitting via qsub通过qsub提交时如何确保snakemake规则依赖
【发布时间】:2019-10-19 06:56:24
【问题描述】:

我正在使用 Snakemake 向集群提交作业。我正面临这样一种情况,我希望仅在所有其他规则都运行后才强制运行特定规则 - 这是因为该作业的输入文件(R 脚本)尚未准备好。

我碰巧在 Snakemake 文档页面上看到了这个,它声明可以强制执行规则 - https://snakemake.readthedocs.io/en/stable/snakefiles/rules.html#flag-files

我有不同的规则,但为了简单起见,我将展示我的 Snakefile 和下面的最后 2 条规则(rsem_model 和 tximport_rsem)。在我的 qsub 集群工作流程中,我希望 tximport_rsem 仅在 rsem_model 完成后执行,我尝试了“touchfile”方法,但无法使其成功运行。

# Snakefile
rule all:
   input:
       expand("results/fastqc/{sample}_fastqc.zip",sample=samples),
       expand("results/bbduk/{sample}_trimmed.fastq",sample=samples),
       expand("results/bbduk/{sample}_trimmed_fastqc.zip",sample=samples),
       expand("results/bam/{sample}_Aligned.toTranscriptome.out.bam",sample=samples),
       expand("results/bam/{sample}_ReadsPerGene.out.tab",sample=samples),
       expand("results/quant/{sample}.genes.results",sample=samples),
       expand("results/quant/{sample}_diagnostic.pdf",sample=samples),
       expand("results/multiqc/project_QS_STAR_RSEM_trial.html"),
       expand("results/rsem_tximport/RSEM_GeneLevel_Summarization.csv"),
       expand("mytask.done")

rule clean:
     shell: "rm -rf .snakemake/"

include: 'rules/fastqc.smk'
include: 'rules/bbduk.smk'
include: 'rules/fastqc_after.smk'
include: 'rules/star_align.smk'
include: 'rules/rsem_norm.smk'
include: 'rules/rsem_model.smk'
include: 'rules/tximport_rsem.smk'
include: 'rules/multiqc.smk'
rule rsem_model:
    input:
        'results/quant/{sample}.genes.results'
    output:
        'results/quant/{sample}_diagnostic.pdf'
    params:
        plotmodel = config['rsem_plot_model'],
        prefix = 'results/quant/{sample}',
        touchfile = 'mytask.done'
    threads: 16
    priority: 60
    shell:"""
          touch {params.touchfile}
          {params.plotmodel} {params.prefix} {output}
        """
rule tximport_rsem:
    input: 'mytask.done'
    output:
        'results/rsem_tximport/RSEM_GeneLevel_Summarization.csv'
    priority: 50
    shell: "Rscript scripts/RSEM_tximport.R"

这是我尝试试运行时遇到的错误

snakemake -np
Building DAG of jobs...
MissingInputException in line 1 of /home/yh6314/rsem/tutorials/QS_Snakemake/rules/tximport_rsem.smk:
Missing input files for rule tximport_rsem:
mytask.done

需要注意的重要一点:如果我尝试在头节点上运行它,我不必执行“触摸文件”并且一切正常。

我将不胜感激建议和帮助找出解决方法。

提前致谢。

【问题讨论】:

    标签: snakemake qsub


    【解决方案1】:

    规则tximport_rsem 将仅在规则rsem_model 的所有作业完成后执行(基于cmets)。因此,在这种情况下,不需要中间文件mytask.done。使用规则rsem_model 的所有样本的输出文件来规则tximport_rsem 就足够了。

    rule rsem_model:
        input:
            'results/quant/{sample}.genes.results'
        output:
            'results/quant/{sample}_diagnostic.pdf',
        shell:
            """
            {params.plotmodel} {params.prefix} {output.pdf}
            """
    
    rule tximport_rsem:
        input: 
             expand('results/quant/{sample}_diagnostic.pdf', sample=sample_names)
        output:
            'results/rsem_tximport/RSEM_GeneLevel_Summarization.csv'
        shell: 
            "Rscript scripts/RSEM_tximport.R"
    

    【讨论】:

    • 嗨 Manavalan 我收到此错误snakemake -np SyntaxError: Not all output, log and benchmark files of rule rsem_model contain the same wildcards. This is crucial though, in order to avoid that two or more jobs write to the same file.
    • 为规则 rsem_model 执行的每个样本都将具有相同的输出文件 mytask.done。这是一个问题,因为多个作业可以写入相同的输出文件,这就是错误所在。虽然从您的示例代码中并不清楚,但看起来规则 tximport_rsem 将仅在对所有样本执行规则 rsem_model 后执行。这是正确的吗?
    • 是的,你是对的 - 我希望 tximport_rsem 仅在规则 rsem_model 运行于所有样本(将由 qsub 分布在许多节点上)之后执行。因此,我需要一个 hack 或一种有效的方法来确保 tximport_rsem 只在所有样本都通过 rsem_model 之后运行一次。
    • 这种情况下,不需要使用中间文件mytask.done。在规则tximport_rsem 中使用expand('results/quant/{sample}_diagnostic.pdf', sample=sample_names 作为输入就足够了。这基本上确保为所有样本运行规则rsem_model,然后运行规则tximport_rsem
    • 感谢 Manavalan - 您的建议有效。如果您可以在上面编辑您的帖子/答案,我可以将其标记为“已回答”。再次感谢。
    猜你喜欢
    • 1970-01-01
    • 2015-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多