【问题标题】:How to select all files from one sample?如何从一个样本中选择所有文件?
【发布时间】:2019-02-15 14:49:57
【问题描述】:

我在弄清楚如何使输入指令仅选择以下规则中的所有 {samples} 文件时遇到问题。

rule MarkDup:
    input:
        expand("Outputs/MergeBamAlignment/{samples}_{lanes}_{flowcells}.merged.bam", zip,
            samples=samples['sample'],
            lanes=samples['lane'],
            flowcells=samples['flowcell']),
    output:
        bam = "Outputs/MarkDuplicates/{samples}_markedDuplicates.bam",
        metrics = "Outputs/MarkDuplicates/{samples}_markedDuplicates.metrics",
    shell:
        "gatk --java-options -Djava.io.tempdir=`pwd`/tmp \
        MarkDuplicates \
        $(echo ' {input}' | sed 's/ / --INPUT /g') \
        -O {output.bam} \
        --VALIDATION_STRINGENCY LENIENT \
        --METRICS_FILE {output.metrics} \
        --MAX_FILE_HANDLES_FOR_READ_ENDS_MAP 200000 \
        --CREATE_INDEX true \
        --TMP_DIR Outputs/MarkDuplicates/tmp"

目前它将创建正确命名的输出文件,但它会根据所有通配符选择与模式匹配的所有文件。所以我可能已经成功了一半。我尝试在输入指令中将{samples} 更改为{{samples}},如下所示:

expand("Outputs/MergeBamAlignment/{{samples}}_{lanes}_{flowcells}.merged.bam", zip,
            lanes=samples['lane'],
            flowcells=samples['flowcell']),`

但这以某种方式打破了以前的规则。所以解决方案类似于

input:
     "{sample}_*.bam"

但这显然行不通。 是否可以收集与 {sample}_*.bam 匹配的所有文件和函数并将其用作输入?如果是这样,该函数是否仍可与 shell 指令中的 $(echo ' {input}' etc...) 一起使用?

【问题讨论】:

    标签: wildcard snakemake


    【解决方案1】:

    如果只想要目录中的所有文件,可以使用 lambda 函数

    from glob import glob
    
    rule MarkDup:
        input:
            lambda wcs: glob('Outputs/MergeBamAlignment/%s*.bam' % wcs.samples)
        output:
            bam="Outputs/MarkDuplicates/{samples}_markedDuplicates.bam",
            metrics="Outputs/MarkDuplicates/{samples}_markedDuplicates.metrics"
        shell:
            ...
    

    请注意,这种方法不能对丢失的文件进行任何检查,因为它总是会报告所需的文件是存在的文件。如果您确实需要确认上游规则已被执行,您可以让之前的规则触摸一个标志,然后您需要该标志作为该规则的输入(尽管您实际上并没有将该文件用于强制执行顺序之外的任何事情) .

    【讨论】:

    • 非常感谢!再加上一个虚假的规则检查点,它可以正常工作。
    【解决方案2】:

    如果我理解正确,zip 只需要应用于{lane}{flowcells},而不是{samples}。在这种情况下,使用两个expand 实例就可以实现。

    input:
        expand(expand("Outputs/MergeBamAlignment/{{samples}}_{lanes}_{flowcells}.merged.bam", 
            zip, lanes=samples['lane'], flowcells=samples['flowcell']), 
                samples=samples['sample'])
    

    PS:output.tmp 文件使用{sample} 而不是{samples}。错字?

    【讨论】:

    • 不幸的是,这仍然违反了以前的规则。我认为这是导致它的{{samples}} 变量。这是错误信息: InputFunctionException in line 48 of /home/oskar/01-workspace/00-temp/GVP/Snakefile: KeyError: 39 Wildcards: sample=SAMPLE1 lane=L003 flowcell=FlowCellY 而这个的意思是它开始组合所有行,而不是逐行组合。是的,它应该是 output.tmp 行中的{samples},它在我实际的 Snakefile 中被注释掉了,我只是忘了在这里删除它。
    猜你喜欢
    • 2022-10-07
    • 2016-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    • 2018-03-19
    • 1970-01-01
    相关资源
    最近更新 更多