能否使用不同的路径/通配符来定义snakemake输入规则

时间:2019-06-04 20:17:25

标签: shell bioinformatics snakemake qsub

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

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

  1. 在原始fastq上使用fastqc-没有下游对其他作业的依赖
  2. 适配器/质量修整以生成修整的fastq
  3. 在裁剪过的fastq上的fastqc_after(步骤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),反之亦然。

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

我已将我的管道以png格式附加到该帖子。任何建议都会有所帮助。

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

谢谢。

My current Snakemake pipeline as png 注意:基于我在原始帖子发布后从“ colin”和“ bli”收到的评论,我在此处共享了不同规则的代码。

第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步-star_align

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步-multiqc

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 个答案:

答案 0 :(得分:1)

如果您希望规则byte[]仅在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: ... 部分中引用rsem_norm的输出,则:

shell

在您的评论之一中,您写道:

  

MultiQC需要目录作为输入-我在shell命令中为其指定了“结果”目录。

如果我理解正确,则意味着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} ..." 是目录,而不是纯文件。在这种情况下,您应确保没有下游规则在这些目录内写入文件。否则,目录将被视为在results/quant/{sample}.genes.results输出之后已更新,并且multiqc将在每次运行管道时重新运行。