下一个规则输入的非传统 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}')