snakemake规则:传递文件名之外的变量

时间:2019-03-18 11:13:01

标签: snakemake

到目前为止,我已经使用snakemake生成了带有snakemake的单个图。效果很好!不过,现在,我想创建一个规则,以创建跨主题的组合图,而无需将名称明确地放在图中。请参阅下面的combined_plot规则。

topics=["soccer", "football"]
params=[1, 2, 3, 4]

rule all:
  input:
    expand("plot_p={param}_{topic}.png", topic=topics, param=params),
    expand("combined_p={param}_plot.png", param=params),

rule plot:
  input:
    "data_p={param}_{topic}.csv"
  output:
    "plot_p={param}_{topic}.png"
  shell:
    "plot.py --input={input} --output={output}"

rule combined_plot:
  input:
    # all data_p={param}_{topic}.csv files
  output:
    "combined_p={param}_plot.png"
  shell:
    "plot2.py " + # one "--input=" and one "--output" for each csv file

有没有一种简单的方法可以通过snakemake做到这一点?

2 个答案:

答案 0 :(得分:1)

如果我理解正确,下面的代码应该更简单,因为它用expand函数代替了lambda和glob。它将执行两个命令:

plot2.py --input=data_p=1_soccer.csv --input=data_p=1_football.csv --output combined_p=1_plot.png
plot2.py --input=data_p=2_soccer.csv --input=data_p=2_football.csv --output combined_p=2_plot.png 

topics=["soccer", "football"]
params=[1, 2]

rule all:
    input:
        expand("combined_p={param}_plot.png", param=params),

rule combined_plot:
    input:
        csv= expand("data_p={{param}}_{topic}.csv", topic= topics)
    output:
        "combined_p={param}_plot.png",
    run:
        inputs= ['--input=' + x for x in input.csv] 
        shell("plot2.py {inputs} --output {output}")

答案 1 :(得分:0)

通过使用名为“ wcs”的函数作为输入(请参见here),我得到了一个有效的版本,我使用了run而不是shell。在run部分中,我可以先定义一个变量,然后再使用shell(...)执行结果。

我也可以直接在lambda函数中使用glob,而不用topics来引用文件。

如果有更多经验的人看到此内容,请告诉我这是否是“正确”的方法。

from glob import glob

topics=["soccer", "football"]
params=[1, 2]

rule all:
  input:
    expand("plot_p={param}_{topic}.png", topic=topics, param=params),
    expand("combined_p={param}_plot.png", param=params),

rule plot:
  input:
    "data_p={param}_{topic}.csv"
  output:
    "plot_p={param}_{topic}.png"
  shell:
    "echo plot.py {input} {output}"

rule combined_plot:
  input:
    lambda wcs: glob("data_p={param}_*.csv".format(**wcs))
  output:
    "combined_p={param}_plot.png"
  run:
    inputs=" ".join(["--input " + inp for inp in input])
    shell("echo plot2.py {inputs}")