wildcard - 如何从一个样本中选择所有文件?

标签 wildcard snakemake

我在弄清楚如何使输入指令仅选择下面规则中的所有 {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...) 吗?

最佳答案

如果你只想要目录中的所有文件,可以使用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:
        ...

请注意,此方法无法对丢失的文件进行任何检查,因为它始终报告所需的文件是存在的文件。如果您确实需要确认上游规则已被执行,您可以让前一个规则触及一个标志,然后您需要将其作为此规则的输入(尽管除了强制执行顺序之外,您实际上并不使用该文件进行任何其他操作) .

关于wildcard - 如何从一个样本中选择所有文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54711807/

相关文章:

jquery - 使用 jQuery 查找页面上元素 ID 包含特定文本的所有元素

mysql - SQL - 如何在 LIKE 中使用通配符作为普通字符

MySQL:SELECT value WHERE 子查询返回通配符值

bioinformatics - 防止输入函数生成示例文件中不存在的文件

Snakemake:你能扩展两个因变量吗?

python - Snakemake如何忽略RuntimeWarning?

snakemake - 在 AWS Batch 中使用 Snakemake 工作流程

java - Java 字符串中的通配符搜索

mysql - 如何过滤掉特定的电子邮件地址?

python-3.x - 如何在Snakemake中进行部分扩展?