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

2024-09-27 01:27:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

dict = {'file_1': {'sample1': 'barcode1', 'sample2': 'barcode2'}}

我需要使用Snakemake来读取此命令,并使用键/值作为输入和输出

这就是我要找的:

Input:
   file_1.fastq.gz
Output:
   o1 = barcode1.fastq.gz, 
   o2 = barcode2.fastq.gz,
Shell:
   """
   do something with {input} barcode1 barcode2
   """

我已经给出了一些我是如何尝试的结构,但是我没有成功

#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}
        """

谢谢大家!


#re-written to hopefully help clarify.

Tags: cmdinputgetnameslinedictfastqlist
1条回答
网友
1楼 · 发布于 2024-09-27 01:27:12

正如我从您添加的原型中了解到的,您的输出将包含在两个文件中,名称中包含条形码

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

output:
    [list barcode1.fastq.gz, barcode2.fastq.gz]

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

output:
    o1 = "{barcode1}.fastq.gz", 
    o2 = "{barcode2}.fastq.gz",

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

通配符值将根据将最终所需文件(*)与规则的输出文件模式相匹配来确定。必须了解:通配符是根据输出文件名确定的。因此,“文件名”没有通配符。您必须在输入函数和字典中使用这些“条形码”通配符来确定相应的输入文件名

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

filename2samples = {'file_1': {'sample1': 'barcode1', 'sample2': 'barcode2'}}

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

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"

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

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

rule all:
    input:
        [
            f"{bc}.fastq.gz" for bc in sample2bc.values()
            for sample2bc in filename2samples.values()]

(未测试)

相关问题 更多 >

    热门问题