可以用不同的 paths/wildcards 定义 snakemake 输入规则吗
Can a snakemake input rule be defined with different paths/wildcards
我想知道是否可以定义一个依赖于不同通配符的输入规则。
详细说明,我是 运行 这个 Snakemake 管道在不同的 fastq 文件上使用 qsub 将每个作业提交到不同的节点:
- 原始 fastq 上的 fastqc - 下游不依赖于其他作业
- adapter/quality 修剪以生成修剪后的 fastq
- fastqc_after 修剪后的 fastq(第 2 步的输出)并且没有下游依赖性
- 修剪后的 fastq 上的 star-rsem 管道(上述第 2 步的输出)
- rsem 和 tximport(第 4 步的输出)
- 运行 multiqc
MultiQC - https://multiqc.info/ - 在结果文件夹上运行,该文件夹包含来自 fastqc、star、rsem 等的结果。但是,因为每个作业都在不同的节点上运行,有时第 3 步(fastqc and/or fastqc_after) 仍在节点上 运行,而其他步骤完成 运行(步骤 2、4 和 5),反之亦然。
目前,我可以创建一个 MultiQc 规则来等待步骤 2、4、5 的结果,因为它们通过 input/output 规则相互链接。
我已将我的管道作为 png 附加到此 post。任何建议都会有所帮助。
我需要什么:我想创建一个 "collating" 步骤,我希望 MultiQC 等待所有步骤(从 1 到 5)完成。换句话说,使用我附加的 png 作为指南,我想为 MultiQC 定义多个输入规则,这些规则也等待 fastqc
的结果
提前致谢。
注意:根据我在原始 post 之后收到的来自“colin' and '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: ...
如果您希望规则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} ..."
在您的一条评论中,您写道:
MultiQC needs directory as input - I give it the 'results' directory in my shell command.
如果我没理解错的话,这意味着 results/quant/{sample}.genes.results
是目录,而不是普通文件。如果是这种情况,您应该确保没有下游规则在这些目录中写入文件。否则,目录将被认为在 multiqc
输出后已更新,并且每次 运行 管道时 multiqc
将是 re-run。
我想知道是否可以定义一个依赖于不同通配符的输入规则。
详细说明,我是 运行 这个 Snakemake 管道在不同的 fastq 文件上使用 qsub 将每个作业提交到不同的节点:
- 原始 fastq 上的 fastqc - 下游不依赖于其他作业
- adapter/quality 修剪以生成修剪后的 fastq
- fastqc_after 修剪后的 fastq(第 2 步的输出)并且没有下游依赖性
- 修剪后的 fastq 上的 star-rsem 管道(上述第 2 步的输出)
- rsem 和 tximport(第 4 步的输出)
- 运行 multiqc
MultiQC - https://multiqc.info/ - 在结果文件夹上运行,该文件夹包含来自 fastqc、star、rsem 等的结果。但是,因为每个作业都在不同的节点上运行,有时第 3 步(fastqc and/or fastqc_after) 仍在节点上 运行,而其他步骤完成 运行(步骤 2、4 和 5),反之亦然。
目前,我可以创建一个 MultiQc 规则来等待步骤 2、4、5 的结果,因为它们通过 input/output 规则相互链接。
我已将我的管道作为 png 附加到此 post。任何建议都会有所帮助。
我需要什么:我想创建一个 "collating" 步骤,我希望 MultiQC 等待所有步骤(从 1 到 5)完成。换句话说,使用我附加的 png 作为指南,我想为 MultiQC 定义多个输入规则,这些规则也等待 fastqc
的结果提前致谢。
步骤 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: ...
如果您希望规则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} ..."
在您的一条评论中,您写道:
MultiQC needs directory as input - I give it the 'results' directory in my shell command.
如果我没理解错的话,这意味着 results/quant/{sample}.genes.results
是目录,而不是普通文件。如果是这种情况,您应该确保没有下游规则在这些目录中写入文件。否则,目录将被认为在 multiqc
输出后已更新,并且每次 运行 管道时 multiqc
将是 re-run。