两个名称不一致的变量作为 Snakemake 规则的输入
Two variables with inconsistent names as input for a Snakemake rule
如果命名不一致并且它们都在同一个文件夹中,我如何在 snakemake 中为规则配对输入数据?
例如,如果我想使用每对样本作为每个规则的输入:
- PT1 T5
- S6 T7
- S1 T20
在这个例子中,我想要 3 对 PT1 & T5、S6 & T7、S1 & T20,所以首先,我想创建 3 个文件夹:
- PT1vsT5
- S6vsT7
- S1vsT20
然后用manta进行分析,将结果输出到这3个文件夹中。
在下面的管道中,我希望 GERMLINE 样本成为每行中的第一个元素(PT1、S6、S1),而 TUMOR 样本成为第二个元素(T5、T7、T20)。
rule all:
input:
expand("/{samples_g}vs{samples_t}", samples_g = GERMLINE, samples_t = TUMOR),
expand("/{samples_g}vs{samples_t}/runWorkflow.py", samples_g = GERMLINE, samples_t = TUMOR),
# Create folders
rule folders:
output: "./{samples_g}vs{samples_t}"
shell: "mkdir {output}"
# Manta configuration
rule manta_config:
input:
g = BAMPATH + "/{samples_g}.bam",
t = BAMPATH + "/{samples_t}.bam"
output:
wf = "{samples_g}vs{samples_t}/runWorkflow.py"
params:
ref = IND,
out_dir = "{samples_g}vs{samples_t}/runWorkflow.py"
shell:
"python configManta.py --normalBam {input.g} --tumorBam {input.t} --referenceFasta {params.ref} --runDir {params.out_dir} "
我可以通过使用包含对的 .txt 作为输入然后使用循环来实现吗?如果是这样我应该怎么做?不然怎么办?
您可以使用任何适当的 python 代码生成输入或输出文件列表 "manually"。例如,您可以按以下步骤生成第一个输入列表:
In [1]: GERMLINE = ("PT1", "S6", "S1")
In [2]: TUMOR = ("T5", "T7", "T20")
In [3]: ["/{}vs{}".format(sample_g, sample_t) for (sample_g, sample_t) in zip(GERMLINE, TUMOR)]
Out[3]: ['/PT1vsT5', '/S6vsT7', '/S1vsT20']
所以这将按如下方式应用:
rule all:
input:
["/{}vs{}".format(sample_g, sample_t) for (sample_g, sample_t) in zip(GERMLINE, TUMOR)],
["/{}vs{}/runWorkflow.py".format(sample_g, sample_t) for (sample_g, sample_t) in zip(GERMLINE, TUMOR)],
(请注意,我将 sample_g
和 sample_t
置于单数形式,因为在这种情况下听起来更合乎逻辑,其中这些变量代表单个样本名称,而不是几个样本的列表)
如果命名不一致并且它们都在同一个文件夹中,我如何在 snakemake 中为规则配对输入数据? 例如,如果我想使用每对样本作为每个规则的输入:
- PT1 T5
- S6 T7
- S1 T20
在这个例子中,我想要 3 对 PT1 & T5、S6 & T7、S1 & T20,所以首先,我想创建 3 个文件夹:
- PT1vsT5
- S6vsT7
- S1vsT20
然后用manta进行分析,将结果输出到这3个文件夹中。
在下面的管道中,我希望 GERMLINE 样本成为每行中的第一个元素(PT1、S6、S1),而 TUMOR 样本成为第二个元素(T5、T7、T20)。
rule all:
input:
expand("/{samples_g}vs{samples_t}", samples_g = GERMLINE, samples_t = TUMOR),
expand("/{samples_g}vs{samples_t}/runWorkflow.py", samples_g = GERMLINE, samples_t = TUMOR),
# Create folders
rule folders:
output: "./{samples_g}vs{samples_t}"
shell: "mkdir {output}"
# Manta configuration
rule manta_config:
input:
g = BAMPATH + "/{samples_g}.bam",
t = BAMPATH + "/{samples_t}.bam"
output:
wf = "{samples_g}vs{samples_t}/runWorkflow.py"
params:
ref = IND,
out_dir = "{samples_g}vs{samples_t}/runWorkflow.py"
shell:
"python configManta.py --normalBam {input.g} --tumorBam {input.t} --referenceFasta {params.ref} --runDir {params.out_dir} "
我可以通过使用包含对的 .txt 作为输入然后使用循环来实现吗?如果是这样我应该怎么做?不然怎么办?
您可以使用任何适当的 python 代码生成输入或输出文件列表 "manually"。例如,您可以按以下步骤生成第一个输入列表:
In [1]: GERMLINE = ("PT1", "S6", "S1")
In [2]: TUMOR = ("T5", "T7", "T20")
In [3]: ["/{}vs{}".format(sample_g, sample_t) for (sample_g, sample_t) in zip(GERMLINE, TUMOR)]
Out[3]: ['/PT1vsT5', '/S6vsT7', '/S1vsT20']
所以这将按如下方式应用:
rule all:
input:
["/{}vs{}".format(sample_g, sample_t) for (sample_g, sample_t) in zip(GERMLINE, TUMOR)],
["/{}vs{}/runWorkflow.py".format(sample_g, sample_t) for (sample_g, sample_t) in zip(GERMLINE, TUMOR)],
(请注意,我将 sample_g
和 sample_t
置于单数形式,因为在这种情况下听起来更合乎逻辑,其中这些变量代表单个样本名称,而不是几个样本的列表)