【问题标题】:Can a snakemake input rule be defined with different paths/wildcards可以用不同的路径/通配符定义蛇形输入规则吗
【发布时间】:2019-06-04 20:17:25
【问题描述】:

我想知道是否可以定义一个依赖于不同通配符的输入规则。

为了详细说明,我正在使用 qsub 在不同的 fastq 文件上运行这个 Snakemake 管道,它将每个作业提交到不同的节点:

  1. 原始 fastq 上的 fastqc - 下游不依赖其他作业
  2. 适配器/质量修剪以生成修剪后的 fastq
  3. fastqc_after on trimmed fastq(第 2 步的输出)且无下游依赖性
  4. 修剪过的 fastq 上的 star-rsem 管道(上面第 2 步的输出)
  5. rsem 和 tximport(步骤 4 的输出)
  6. 运行 multiqc

MultiQC - https://multiqc.info/ - 在包含 fastqc、star、rsem 等结果的结果文件夹上运行。但是,由于每个作业在不同的节点上运行,有时第 3 步(fastqc 和/或 fastqc_after)仍在运行在节点上,而其他步骤完成运行(步骤 2、4 和 5)或反之亦然。

目前,我可以创建一个等待第 2、4、5 步结果的 MultiQc 规则,因为它们通过输入/输出规则相互链接。

我已将我的管道以 png 格式附加到这篇文章中。任何建议都会有所帮助。

我需要什么:我想创建一个“整理”步骤,我希望 MultiQC 等待所有步骤(从 1 到 5)完成。换句话说,使用我附加的 png 作为指南,我想为 MultiQC 定义多个输入规则,这些规则也等待来自 fastqc 的结果

提前致谢。

注意:根据我在原帖后从“colin”和“bli”收到的 cmets,我在此处分享了不同规则的代码。

第 1 步 - fastqc

rule fastqc:
    input:  "raw_fastq/{sample}.fastq"
    output: "results/fastqc/{sample}_fastqc.zip"
    log: "results/logs/fq_before/{sample}.fastqc.log"
    params: ...
    shell: ...

第 2 步 - bbduk

rule bbduk:
    input: R1 = "raw_fastq/{sample}.fastq"
    output: R1 = "results/bbduk/{sample}_trimmed.fastq",
    params: ...
    log: "results/logs/bbduk/{sample}.bbduk.log"
    priority:95
    shell: ....

第 3 步 - fastqc_after

rule fastqc_after:
    input:  "results/bbduk/{sample}_trimmed.fastq"
    output: "results/bbduk/{sample}_trimmed_fastqc.zip"
    log: "results/logs/fq_after/{sample}_trimmed.fastqc.log"
    priority: 70
    params: ...
    shell: ...

第 4 步 - 星形对齐

rule star_align:
    input: R1 = "results/bbduk/{sample}_trimmed.fastq"
    output:
        out_1 = "results/bam/{sample}_Aligned.toTranscriptome.out.bam",
        out_2 = "results/bam/{sample}_ReadsPerGene.out.tab"
    params: ...
    log: "results/logs/star/{sample}.star.log"
    priority:90
    shell: ...

第 5 步 - rsem_norm

rule rsem_norm:
    input:
        bam = "results/bam/{sample}_Aligned.toTranscriptome.out.bam"
    output:
        genes = "results/quant/{sample}.genes.results"
    params: ...
    threads = 16
    priority:85
    shell: ...

第 6 步 - rsem_model

rule rsem_model:
    input: "results/quant/{sample}.genes.results"
    output: "results/quant/{sample}_diagnostic.pdf"
    params: ...      
    shell: ...

第 7 步 - tximport_rsem

rule tximport_rsem:
        input: expand("results/quant/{sample}_diagnostic.pdf",sample=samples)
        output: "results/rsem_tximport/RSEM_GeneLevel_Summarization.csv"
        shell: ...

第 8 步 - 多重质控

rule multiqc:
    input: expand("results/quant/{sample}.genes.results",sample=samples)
    output: "results/multiqc/project_QS_STAR_RSEM_trial.html"
    log: "results/log/multiqc"
    shell: ...

【问题讨论】:

  • 我不太明白你的问题。您说第 1 步和第 3 步没有下游依赖关系,但您不希望 MultiQC 在它们完成之前运行?这听起来像是一种依赖。如果这些规则创建 MultiQC 所需的输出,则应将这些输出文件指定为 MultiQC 规则的输入文件。如果不是,则不应有理由要求在执行 MultiQC 步骤之前完成这些步骤。
  • 您应该至少显示当前multiqc 规则的input 部分和fastqc 规则的output 部分。
  • @Colin dag/png 列出了当前的依赖关系。如果我需要进一步解释,请告诉我。到目前为止,我告诉“规则 multiqc”等待“rsem_norm”的输出(它将数据输出到结果/量化/{sample})。我希望 multiqc 也等待来自“fastqc”和“fastqc_after”的输出,它们分别输出到“results/fastqc”和“results/bbduk”。这是我需要帮助的地方 - 因此首先是原始问题。正如您在此处看到的,重要的目录是“结果”目录及其子文件夹 - MultiQC 将在此顶级目录上工作。
  • @bli 我在我的问题中添加了不同的规则。 MultiQC 需要目录作为输入——我在我的 shell 命令中给它“结果”目录。所有步骤的日志文件都位于“结果”下的不同文件夹/子文件夹中,MultiQC 能够深入所有步骤并提供报告。这里发生的情况是这样的:由于 qsub 将每个作业提交到不同的节点,当前面的步骤(我编码的方式)完成时,MultiQC 步骤完成运行。这让我想到了我原来的问题:我怎么能给出 3不同的文件夹路径作为 MultiQC 规则的输入

标签: shell bioinformatics snakemake qsub


【解决方案1】:

如果您希望规则 multiqc 仅在 fastqc 完成后发生,您可以将 fastqc 的输出添加到 multiqc 的输入:

rule multiqc:
    input:
        expand("results/quant/{sample}.genes.results",sample=samples),
        expand("results/fastqc/{sample}_fastqc.zip", sample=samples)
    output: "results/multiqc/project_QS_STAR_RSEM_trial.html"
    log: "results/log/multiqc"
    shell: ...

或者,如果您需要能够在 shell 部分中引用 rsem_norm 的输出:

rule multiqc:
    input:
        rsem_out = expand("results/quant/{sample}.genes.results",sample=samples),
        fastqc_out = expand("results/fastqc/{sample}_fastqc.zip", sample=samples)
    output: "results/multiqc/project_QS_STAR_RSEM_trial.html"
    log: "results/log/multiqc"
    shell: "... {input.rsem_out} ..."

在你的一个 cmets 中,你写道:

MultiQC 需要目录作为输入 - 我在我的 shell 命令中给它“结果”目录。

如果我理解正确,这意味着results/quant/{sample}.genes.results 是目录,而不是普通文件。如果是这种情况,您应该确保没有下游规则将文件写入这些目录中。否则,在multiqc输出后,目录将被视为已更新,并且每次运行管道时都会重新运行multiqc

【讨论】:

  • 感谢@bli,您的解决方案有效。我最初尝试“没有扩展”但它不起作用。我最初将multiqc 输入为:'results/quant/{sample}.genes.results''results/fastqc/{sample}_fastqc.zip' - 但是,使用您建议的方式扩展有助于解决问题。 results/quant/{sample}.genes.results 是实际文件 - 所以如果我有 sampleA、sampleB、sampleC 作为我的起始材料,我会得到 results/quant/sampleA.genes.results、results/quant/sampleB.genes.results、results/quant/sampleC。 genes.results 作为输出
猜你喜欢
  • 1970-01-01
  • 2011-11-09
  • 1970-01-01
  • 2023-03-13
  • 2016-07-02
  • 2011-11-30
  • 2016-05-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多