我有一个字典,可以将文件名映射到样本名称,再映射到条形码:
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.发布于 2020-11-03 17:52:38
根据我从您添加的原型中了解到的信息,您的输出将包含在两个文件中,它们的名称中包含条形码。
我不明白为什么在您的实现尝试中会有这种奇怪的语法:
output:
[list barcode1.fastq.gz, barcode2.fastq.gz]您可能只需要像在“原型”中那样做,但使用条形码作为通配符(请注意大括号和引号):
output:
o1 = "{barcode1}.fastq.gz",
o2 = "{barcode2}.fastq.gz",(如果您在run部分中不使用output.o1和output.o2,这不是问题,只要您确定该命令将生成具有给定条形码的所需名称的文件。)
通配符值将基于最终所需文件(*)与规则的输出文件模式的匹配来确定。重要的是要理解:通配符是由输出文件名确定的。因此,您将不会使用通配符作为"filename“。您必须以某种方式在输入函数和字典中使用这些“条形码”通配符来确定相应的输入文件名。
假设字典从文件名到您的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"可以使用类似的方法来构建该命令。
(*)您还需要一个“驱动”规则,输入最终所需文件的名称。您应该将此规则放在您的snakefile中的其他规则之前:
rule all:
input:
[
f"{bc}.fastq.gz" for bc in sample2bc.values()
for sample2bc in filename2samples.values()](未测试)
https://stackoverflow.com/questions/64567016
复制相似问题