Snakemake 多个输入文件扩展但没有重复
Snakemake multiple input files with expand but no repetitions
我是 snakemake 的新手,我不知道如何解决这个问题。
我的规则有两个输入:
rule test
input_file1=f1
input_file2=f2
f1 在 [A{1}$, A{2}£, B{1}€, B{2}¥]
f2 在 [C{1}, C{2}]
这些数字是来自展开调用的通配符。我需要找到一种方法将一对与数字完全匹配的文件传递给文件 f1 和 f2。例如:
f1 = A1
f2 = C1
或
f1 = B1
f2 = C1
我必须避免组合,例如:
f1 = A1
f2 = C2
我会创建一个函数来在文件之间进行这种匹配,但它应该同时管理 input_file1 和 input_file2。我想创建一个函数来创建一个包含不同允许组合的字典,但我如何 "iterate" 在展开期间覆盖它?
谢谢
假设规则 test
在输出中为您提供了一个名为 {f1}.{f2}.txt
的文件,那么您需要某种机制来正确配对 f1 和 f2 并创建一个 {f1}.{f2}.txt
文件列表。
如何创建此列表由您决定,expand
只是一个方便的功能,但在这种情况下您可能希望避免使用它。
这是一个超级简单的例子:
fin1 = ['A1$', 'A2£', 'B1€', 'B2¥']
fin2 = ['C1', 'C2']
outfiles = []
for x in fin1:
for y in fin2:
## Here you pair f1 and f2. This is a very trivial way of doing it:
if y[1] in x:
outfiles.append('%s.%s.txt' % (x, y))
wildcard_constraints:
f1 = '|'.join([re.escape(x) for x in fin1]),
f2 = '|'.join([re.escape(x) for x in fin2]),
rule all:
input:
outfiles,
rule test:
input:
input_f1 = '{f1}.txt',
input_f2 = '{f2}.txt',
output:
'{f1}.{f2}.txt',
shell:
r"""
cat {input} > {output}
"""
此管道将执行以下命令
cat A2£.txt C2.txt > A2£.C2.txt
cat A1$.txt C1.txt > A1$.C1.txt
cat B1€.txt C1.txt > B1€.C1.txt
cat B2¥.txt C2.txt > B2¥.C2.txt
如果您使用 touch 'A1$.txt' 'A2£.txt' 'B1€.txt' 'B2¥.txt' 'C1.txt' 'C2.txt'
触摸起始输入文件,您应该能够 运行 这个例子。
我是 snakemake 的新手,我不知道如何解决这个问题。
我的规则有两个输入:
rule test
input_file1=f1
input_file2=f2
f1 在 [A{1}$, A{2}£, B{1}€, B{2}¥]
f2 在 [C{1}, C{2}]
这些数字是来自展开调用的通配符。我需要找到一种方法将一对与数字完全匹配的文件传递给文件 f1 和 f2。例如:
f1 = A1
f2 = C1
或
f1 = B1
f2 = C1
我必须避免组合,例如:
f1 = A1
f2 = C2
我会创建一个函数来在文件之间进行这种匹配,但它应该同时管理 input_file1 和 input_file2。我想创建一个函数来创建一个包含不同允许组合的字典,但我如何 "iterate" 在展开期间覆盖它?
谢谢
假设规则 test
在输出中为您提供了一个名为 {f1}.{f2}.txt
的文件,那么您需要某种机制来正确配对 f1 和 f2 并创建一个 {f1}.{f2}.txt
文件列表。
如何创建此列表由您决定,expand
只是一个方便的功能,但在这种情况下您可能希望避免使用它。
这是一个超级简单的例子:
fin1 = ['A1$', 'A2£', 'B1€', 'B2¥']
fin2 = ['C1', 'C2']
outfiles = []
for x in fin1:
for y in fin2:
## Here you pair f1 and f2. This is a very trivial way of doing it:
if y[1] in x:
outfiles.append('%s.%s.txt' % (x, y))
wildcard_constraints:
f1 = '|'.join([re.escape(x) for x in fin1]),
f2 = '|'.join([re.escape(x) for x in fin2]),
rule all:
input:
outfiles,
rule test:
input:
input_f1 = '{f1}.txt',
input_f2 = '{f2}.txt',
output:
'{f1}.{f2}.txt',
shell:
r"""
cat {input} > {output}
"""
此管道将执行以下命令
cat A2£.txt C2.txt > A2£.C2.txt
cat A1$.txt C1.txt > A1$.C1.txt
cat B1€.txt C1.txt > B1€.C1.txt
cat B2¥.txt C2.txt > B2¥.C2.txt
如果您使用 touch 'A1$.txt' 'A2£.txt' 'B1€.txt' 'B2¥.txt' 'C1.txt' 'C2.txt'
触摸起始输入文件,您应该能够 运行 这个例子。