如何解决如何在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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。