首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用dict定义Snakemake一个输入,多个输出

使用dict定义Snakemake一个输入,多个输出
EN

Stack Overflow用户
提问于 2020-10-28 13:38:54
回答 1查看 93关注 0票数 0

我有一个字典,可以将文件名映射到样本名称,再映射到条形码:

代码语言:javascript
复制
dict = {'file_1': {'sample1': 'barcode1', 'sample2': 'barcode2'}}

我需要使用Snakemake来读取这个字典,并使用键/值作为输入和输出。

这就是我要找的:

代码语言:javascript
复制
Input:
   file_1.fastq.gz
Output:
   o1 = barcode1.fastq.gz, 
   o2 = barcode2.fastq.gz,
Shell:
   """
   do something with {input} barcode1 barcode2
   """

我已经给出了一些我一直在尝试的结构,但我一直没有成功。

代码语言:javascript
复制
#get list of fq names based on multiplex name
def get_fq_names(wildcards):
    fq = dict[wildcards.filename]
    return(fq)

#create demux command line
def demux_cmd(wildcards):
    cmd_line = multiplex_dict[wildcards.filename] + [LIST OF BARCODES]
    return(cmd_line)

#rule to perform demux
rule demultiplex:
    input:
        f1 = get_fq_names
    params:
        cmd = demux_cmd,
    output:
        [list barcode1.fastq.gz, barcode2.fastq.gz]
    shell:
        """
        {params.cmd}
        """

谢谢!

代码语言:javascript
复制
#re-written to hopefully help clarify.
EN

回答 1

Stack Overflow用户

发布于 2020-11-03 17:52:38

根据我从您添加的原型中了解到的信息,您的输出将包含在两个文件中,它们的名称中包含条形码。

我不明白为什么在您的实现尝试中会有这种奇怪的语法:

代码语言:javascript
复制
output:
    [list barcode1.fastq.gz, barcode2.fastq.gz]

您可能只需要像在“原型”中那样做,但使用条形码作为通配符(请注意大括号和引号):

代码语言:javascript
复制
output:
    o1 = "{barcode1}.fastq.gz", 
    o2 = "{barcode2}.fastq.gz",

(如果您在run部分中不使用output.o1output.o2,这不是问题,只要您确定该命令将生成具有给定条形码的所需名称的文件。)

通配符值将基于最终所需文件(*)与规则的输出文件模式的匹配来确定。重要的是要理解:通配符是由输出文件名确定的。因此,您将不会使用通配符作为"filename“。您必须以某种方式在输入函数和字典中使用这些“条形码”通配符来确定相应的输入文件名。

假设字典从文件名到您的snakefile中定义的条形码:

代码语言:javascript
复制
filename2samples = {'file_1': {'sample1': 'barcode1', 'sample2': 'barcode2'}}

您的输入函数可以使用循环在字典中“反转”查找,直到找到通配符中的条形码,如下所示:

代码语言:javascript
复制
def get_fq_names(wildcards):
    for (filename, sample2bc) in filename2samples.items():
        if sample2bc["sample1"] == wildcards.barcode1 and sample2bc["sample2"] == wildcards.barcode2:
            # (f-string syntax requires python 3.6 or above)
            return f"{filename}.fastq.gz"

可以使用类似的方法来构建该命令。

(*)您还需要一个“驱动”规则,输入最终所需文件的名称。您应该将此规则放在您的snakefile中的其他规则之前:

代码语言:javascript
复制
rule all:
    input:
        [
            f"{bc}.fastq.gz" for bc in sample2bc.values()
            for sample2bc in filename2samples.values()]

(未测试)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64567016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档