如何在snakemake工作流程中追溯用于生成结果文件的确切软件版本

问题描述

说我正在遵循针对snakemake建议的最佳实践工作流。现在,我想知道给定文件plots/myplot.pdf的生成方式(即哪个版本)。我发现只有手头有结果文件夹,这很难甚至很难做到。

更详细地说,说我是使用生成结果的。 snakemake --use-conda --conda-prefix ~/.conda/myenvs,它将解析并下载以下规则中指定的conda环境(从documentation复制):

rule NAME:
    input:
        "table.txt"
    output:
        "plots/myplot.pdf"
    conda:
        "envs/ggplot.yaml"
    script:
        "scripts/plot-stuff.R"

envs/ggplot.yaml的内容如下:

channels:
  - conda-forge
dependencies:
  - r-ggplot2

完成后,ggplot环境将被保存为say(注意,snakemake自动分配的环境名称d2d1d57b): 〜/ .conda / myevns / d2d1d57b

问题是,如果我运送workflow子文件夹,例如作为对其他人的结果(或作为论文的补充),我不知道该运行使用了什么ggplot版本。我只知道yaml文件的内容(使用--reports时也会报告该文件。)。 另外,由于ggplot依赖于其他软件,例如R,因此我不知道使用该环境的给定规则使用了哪个R版本,因为yaml文件未列出间接依赖关系。

理想情况下,我想随工作流结果一起提供完整的环境软件版本。 作为一种解决方法,可以使用conda env export name_of_env并将输出复制到结果文件夹中,但是conda list -n ~/.conda/myevns/d2d1d57b不能正常工作(由于错误Characters not allowed: ('/',' ',':','#')

手动创建环境并进行检查确实可以给我带来其他信息:

r-base                    4.0.2                he766273_1    conda-forge
r-ggplot2                 3.3.2             r40h6115d3f_0    conda-forge

这正是我所追求的,但是手动操作当然太麻烦了。

据我所知,使用包装器时也是如此。

总而言之,对于给定的工作流程,甚至对于工作流程中的给定文件,如何追溯使用哪些确切的软件版本来生成它。理想情况下,默认情况下,此信息将自动随工作流一起提供。

也许我什至错过了一些非常明显的东西,所以希望有人可以对此有所启发。

解决方法

根据我们在评论中的讨论,您可以将环境重定向到日志文件:

rule NAME:
    input:
        "table.txt"
    output:
        "plots/myplot.pdf"
    log:
        "mylog.txt"
    conda:
        "envs/ggplot.yaml"
    shell:
        """
        conda env export > {log} 
        yourcode
        """

但是,正如您指出的那样,如果人们不使用--use-conda,则此方法将不起作用,此外,将其添加到每个规则很繁琐,因此您可以尝试这样的操作(未经测试,可能无法工作):

if workflow.use_conda:
    shell.prefix("set -o pipefail; conda env export > {log}; ")

将导出内容添加到每个shell命令中!

现在,如果您使用脚本,则我不确定如何继续。 “最简单的”操作可能只是在python / R内的shell命令中调用“ conda env export”

修改

shell前缀技巧似乎无效,因此我删除了文本。

,

如@ Maarten-vd-Sande所述,版本应在conda env文件中指定。正如您可能想到的那样,您还需要在conda env文件中定义r-base及其版本,以确保使用R的特定版本。请参见这里的snakemake的example包装器。

作为可重复研究最佳实践的一部分,强烈建议在conda env文件中指定工具版本。 Snakemake包装器通常遵循此规则,但您可能会发现some not following this

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...