下一个规则输入的非传统 Snakemake 输出
Non traditionally Snakemake output for next rules input
我想创建 Snakemake 文档中没有描述的奇怪 Snakemake 规则。我的规则 picard_dupes 生成三个输出、指标、bams 和 bai 文件。但是,与通过输出创建的 bams 和指标不同,bai 是在不在输出中的 CREATE_INDEX 中创建的。创建的是 .bai 而不是 bam.bai 文件。在规则 picard_bai 中重命名此文件以在以后的规则中识别。但是,我收到一个错误:缺少规则 picard_bai 的输入文件。这告诉我的 Snakemake 正试图在 picard_dup 之前执行 picard_bai。我怎样才能使它在我的 bai 输出不在输出中以移动到下一个输入规则的情况下工作?
rule picard_dupes:
input: rules.star_aligner.output.bam
output:
bam = 'picard/{sampleID}_marked_duplicates.bam',
metric = 'picard/{sampleID}_marked_dup_metrics.txt'
threads: 12
run:
shell('picard MarkDuplicates \
-Xmx4G \
-XX:ParallelGCThreads={threads} \
I={input} \
O={output.bam} \
M={output.metric} \
CREATE_INDEX=true ASSUME_SORT_ORDER=coordinate OPTICAL_DUPLICATE_PIXEL_DISTANCE=100')
rule picard_bai:
input: 'picard/{sampleID}_marked_duplicates.bai'
output:
bai = 'picard/{sampleID}_marked_duplicates.bam.bai'
run:
shell('mv {input} {output.bai}')
Snakemake 只知道你告诉它什么。在这种情况下,您不会让 snakemake 知道 picard_dupes 也会创建 bai 文件。我喜欢调用这些隐式输出,因为您没有在 shell 命令中显式创建它们。只需将输出指令更改为:
output:
bam = 'picard/{sampleID}_marked_duplicates.bam',
metric = 'picard/{sampleID}_marked_dup_metrics.txt',
index = 'picard/{sampleID}_marked_duplicates.bai',
作为一个小的改进,您可以完全跳过 picard_bai 并在 picard_dupes 中执行重命名
rule picard_dupes:
input: rules.star_aligner.output.bam
output:
bam = 'picard/{sampleID}_marked_duplicates.bam',
metric = 'picard/{sampleID}_marked_dup_metrics.txt',
index = 'picard/{sampleID}_marked_duplicates.bai',
threads: 12
run:
shell('picard MarkDuplicates \
-Xmx4G \
-XX:ParallelGCThreads={threads} \
I={input} \
O={output.bam} \
M={output.metric} \
CREATE_INDEX=true ASSUME_SORT_ORDER=coordinate OPTICAL_DUPLICATE_PIXEL_DISTANCE=100')
bai_file = output.bam[:-1] + 'i' # generate bai filename
shell('mv {bai_file} {output.index}')
我想创建 Snakemake 文档中没有描述的奇怪 Snakemake 规则。我的规则 picard_dupes 生成三个输出、指标、bams 和 bai 文件。但是,与通过输出创建的 bams 和指标不同,bai 是在不在输出中的 CREATE_INDEX 中创建的。创建的是 .bai 而不是 bam.bai 文件。在规则 picard_bai 中重命名此文件以在以后的规则中识别。但是,我收到一个错误:缺少规则 picard_bai 的输入文件。这告诉我的 Snakemake 正试图在 picard_dup 之前执行 picard_bai。我怎样才能使它在我的 bai 输出不在输出中以移动到下一个输入规则的情况下工作?
rule picard_dupes:
input: rules.star_aligner.output.bam
output:
bam = 'picard/{sampleID}_marked_duplicates.bam',
metric = 'picard/{sampleID}_marked_dup_metrics.txt'
threads: 12
run:
shell('picard MarkDuplicates \
-Xmx4G \
-XX:ParallelGCThreads={threads} \
I={input} \
O={output.bam} \
M={output.metric} \
CREATE_INDEX=true ASSUME_SORT_ORDER=coordinate OPTICAL_DUPLICATE_PIXEL_DISTANCE=100')
rule picard_bai:
input: 'picard/{sampleID}_marked_duplicates.bai'
output:
bai = 'picard/{sampleID}_marked_duplicates.bam.bai'
run:
shell('mv {input} {output.bai}')
Snakemake 只知道你告诉它什么。在这种情况下,您不会让 snakemake 知道 picard_dupes 也会创建 bai 文件。我喜欢调用这些隐式输出,因为您没有在 shell 命令中显式创建它们。只需将输出指令更改为:
output:
bam = 'picard/{sampleID}_marked_duplicates.bam',
metric = 'picard/{sampleID}_marked_dup_metrics.txt',
index = 'picard/{sampleID}_marked_duplicates.bai',
作为一个小的改进,您可以完全跳过 picard_bai 并在 picard_dupes 中执行重命名
rule picard_dupes:
input: rules.star_aligner.output.bam
output:
bam = 'picard/{sampleID}_marked_duplicates.bam',
metric = 'picard/{sampleID}_marked_dup_metrics.txt',
index = 'picard/{sampleID}_marked_duplicates.bai',
threads: 12
run:
shell('picard MarkDuplicates \
-Xmx4G \
-XX:ParallelGCThreads={threads} \
I={input} \
O={output.bam} \
M={output.metric} \
CREATE_INDEX=true ASSUME_SORT_ORDER=coordinate OPTICAL_DUPLICATE_PIXEL_DISTANCE=100')
bai_file = output.bam[:-1] + 'i' # generate bai filename
shell('mv {bai_file} {output.index}')