Snakemake - 如何设置conda环境路径
Snakemake - How to set conda environment path
在 Snakemake 中,conda 环境可以通过定义规则来轻松设置 conda: "envs/my_environment.yaml"
。这样,YAML 文件指定在 运行 管道之前安装哪些包。
某些软件需要第三方软件的路径才能执行特定命令。
这方面的一个示例是使用 RSEM 生成参考索引时(示例来自 GitHub 页 DeweyLab - RSEM):
rsem-prepare-reference --gtf mm9.gtf \
--star \
--star-path /sw/STAR \
-p 8 \
--prep-pRSEM \
--bowtie-path /sw/bowtie \
--mappability-bigwig-file /data/mm9.bigWig \
/data/mm9 \
/ref/mouse_0
我可以找到或预定义 STAR
对准器软件的目录(例如 [workdir]/.snakemake/conda/STAR
)吗?
目前,一种选择可能是创建一个共享环境文件夹,使用命令行界面选项:--conda-prefix
Snakemake docs - Command-line interface,但是由于这是一个单一案例问题,我会更愿意在规则中定义此信息。
我有两种处理方法。
1:让 Conda 处理 PATH
如果 STAR 不在 PATH 上,则只需要指定该特定选项 (--star-path
) 。但是,如果此规则的 STAR 包含在您的 YAML 中,那么 Conda 会将其作为环境激活的一部分放在 PATH 上,因此不需要该选项。 --bowtie-path
也是如此。因此,对于这样的规则,YAML 可能类似于:
name: rsem
channels:
- conda-forge
- bioconda
- defaults
dependencies:
- rsem
- star
- bowtie
,考虑将软件包上的版本修复为次要版本(例如,bowtie=1.3
)。
2:使用 config.yaml
作为管道选项
如果出于某种原因您不想要一个完全独立的管道,例如,您的系统已经预装了许多标准基因组学软件,例如 STAR,那么您可以在 config.yaml
中包含一个条目,其中用户应根据自己的系统调整管道。例如,这里是相关部分:
config.yaml
star_path: /sw/STAR
bowtie_path: /sw/bowtie
Snakefile
configfile: config.yaml
## this is not a complete rule
rule rsem_prep_ref:
# needs input, output...
params:
star=config['star_path'],
bowtie=config['bowtie_path']
threads: 8
conda: "envs/myenv.yaml"
shell:
"""
rsem-prepare-reference --gtf mm9.gtf \
--star \
--star-path {params.star} \
-p {threads} \
--prep-pRSEM \
--bowtie-path {params.bowtie} \
--mappability-bigwig-file /data/mm9.bigWig \
/data/mm9 \
/ref/mouse_0
"""
实际上,您的管道假定已经存在并且不是由管道本身生成的任何内容都应该进入您的 config.yaml
(例如,mm9.gtf
或 mm9.bigWig
)。
关于共享环境的注意事项
一般来说,我建议不要尝试共享环境。但是,您仍然可以通过在用户之间共享 程序包缓存 并确保在同一文件系统上创建环境(这让 Conda 使用硬链接而不是复制)来节省 space。您可以使用 Conda 配置选项 pkgs_dirs
来设置包缓存位置。如果管道本身已经在与 Conda 包缓存相同的文件系统上,我会让 Snakemake 使用默认位置(.snakemake/conda
)而不是弄乱 --conda-prefix
参数。
否则,您可以为 Snakemake 提供 --conda-prefix
参数以指向在同一文件系统 上创建 Conda 环境的目录 。这应该是一个相当通用的目录,管道的所有环境都位于其中。 OP ([workdir]/.snakemake/conda/STAR
) 中提出的内容没有意义。
我想在@merv 的回答中添加第三个选项。您可以使用 which
动态找出路径(假设它在您的系统上启用):
rsem-prepare-reference --star-path $(which star) ...
在 Snakemake 中,conda 环境可以通过定义规则来轻松设置 conda: "envs/my_environment.yaml"
。这样,YAML 文件指定在 运行 管道之前安装哪些包。
某些软件需要第三方软件的路径才能执行特定命令。
这方面的一个示例是使用 RSEM 生成参考索引时(示例来自 GitHub 页 DeweyLab - RSEM):
rsem-prepare-reference --gtf mm9.gtf \
--star \
--star-path /sw/STAR \
-p 8 \
--prep-pRSEM \
--bowtie-path /sw/bowtie \
--mappability-bigwig-file /data/mm9.bigWig \
/data/mm9 \
/ref/mouse_0
我可以找到或预定义 STAR
对准器软件的目录(例如 [workdir]/.snakemake/conda/STAR
)吗?
目前,一种选择可能是创建一个共享环境文件夹,使用命令行界面选项:--conda-prefix
Snakemake docs - Command-line interface,但是由于这是一个单一案例问题,我会更愿意在规则中定义此信息。
我有两种处理方法。
1:让 Conda 处理 PATH
如果 STAR 不在 PATH 上,则只需要指定该特定选项 (--star-path
) 。但是,如果此规则的 STAR 包含在您的 YAML 中,那么 Conda 会将其作为环境激活的一部分放在 PATH 上,因此不需要该选项。 --bowtie-path
也是如此。因此,对于这样的规则,YAML 可能类似于:
name: rsem
channels:
- conda-forge
- bioconda
- defaults
dependencies:
- rsem
- star
- bowtie
bowtie=1.3
)。
2:使用 config.yaml
作为管道选项
如果出于某种原因您不想要一个完全独立的管道,例如,您的系统已经预装了许多标准基因组学软件,例如 STAR,那么您可以在 config.yaml
中包含一个条目,其中用户应根据自己的系统调整管道。例如,这里是相关部分:
config.yaml
star_path: /sw/STAR
bowtie_path: /sw/bowtie
Snakefile
configfile: config.yaml
## this is not a complete rule
rule rsem_prep_ref:
# needs input, output...
params:
star=config['star_path'],
bowtie=config['bowtie_path']
threads: 8
conda: "envs/myenv.yaml"
shell:
"""
rsem-prepare-reference --gtf mm9.gtf \
--star \
--star-path {params.star} \
-p {threads} \
--prep-pRSEM \
--bowtie-path {params.bowtie} \
--mappability-bigwig-file /data/mm9.bigWig \
/data/mm9 \
/ref/mouse_0
"""
实际上,您的管道假定已经存在并且不是由管道本身生成的任何内容都应该进入您的 config.yaml
(例如,mm9.gtf
或 mm9.bigWig
)。
关于共享环境的注意事项
一般来说,我建议不要尝试共享环境。但是,您仍然可以通过在用户之间共享 程序包缓存 并确保在同一文件系统上创建环境(这让 Conda 使用硬链接而不是复制)来节省 space。您可以使用 Conda 配置选项 pkgs_dirs
来设置包缓存位置。如果管道本身已经在与 Conda 包缓存相同的文件系统上,我会让 Snakemake 使用默认位置(.snakemake/conda
)而不是弄乱 --conda-prefix
参数。
否则,您可以为 Snakemake 提供 --conda-prefix
参数以指向在同一文件系统 上创建 Conda 环境的目录 。这应该是一个相当通用的目录,管道的所有环境都位于其中。 OP ([workdir]/.snakemake/conda/STAR
) 中提出的内容没有意义。
我想在@merv 的回答中添加第三个选项。您可以使用 which
动态找出路径(假设它在您的系统上启用):
rsem-prepare-reference --star-path $(which star) ...