我开始尝试在Snakemake中使用容器,我有一个问题,即哪些需要预构建到容器中,哪些不需要。例如:
我想在一个容器中运行一个python脚本(例如,存储在workflow_root/scripts/ www.example.com中myScript.py),并通过管道从另一个程序导入。我是否需要将python脚本构建到容器中,将其声明为输入文件,或者可以从容器中访问它(以及如何指向它)?我当前的规则如下所示:
rule myRule:
params:
sample = get_sample,
basePath = sys.path[0]
input:
in1=get_in1,
in2=get_in2
output:
out1 = "{runPath}/{sample}_read1_dcs.fq.gz",
out2 = "{runPath}/{sample}_read2_dcs.fq.gz"
priority: 50
conda:
"envs/myEnv.yaml"
log:
"{runPath}/logs/{sample}_myRule.log"
shell:
"""
set -e
set -o pipefail
set -x
{{
picard FastqToSam \
F1={input.in1} \
F2={input.in2} \
O=/dev/stdout \
SM={params.sample} \
TMP_DIR=picardTempDir \
SORT_ORDER=unsorted \
| python3 {params.basePath}/scripts/myScript.py \
--input /dev/stdin \
--prefix {wildcards.sample}
}} 2>&1 | tee -a {log}
"""
我想运行bwa,在那里我需要使用一个相当大的用户提供的引用。我可以这样做吗?或者我需要将该引用构建到容器中吗?(我还想使用ensemble-VEP,它有自己的相当大的引用数据库要处理)。
我想我的问题归结起来就是:Snakemake将哪些文件/位置挂载到容器中,当我编写涉及shell命令的规则时,我在哪里可以找到它们?文档似乎对此不是很清楚,如果能够在不做大量实验的情况下弄清楚这一点,那就太好了。
2条答案
按热度按时间yhqotfr81#
我将分享我如何使用snakemake与singularity和conda。这个设置已经为我工作了一年多。这个设置可能适合也可能不适合你的目的;所以你可以随便问问题。
singularity:
指令在全局级别定义的,我没有手工构建容器;造蛇者就是这样。conda:
指令定义的。在复杂的项目中,有时可能有超过15-20个独立的conda环境。Snakemake在singularity容器中构建这些conda环境。configfile:
指令定义)包含它们的路径信息。示例Snakefile如下所示:
只要工作流程所需的所有工具都可通过conda使用,此设置就有效。也可以覆盖特定规则的全局奇点容器,并使用不同的奇点容器或根本不使用容器。
此外,我不构建自己的奇点容器,而是使用docker-hub提供的通用容器。无论如何,我没有权限在我使用的HPC系统中构建自己的奇点容器。因此,这种设置消除了在某处构建映像,然后将其移动到HPC环境的麻烦。
tzdcorbm2#
工作目录下的所有内容都是可用的,并且可以按预期访问。但是,通过绝对路径引用的内容需要挂载。
因此,如果您的脚本位于
scripts/my_script.py
目录下,那么它将按原样可用。但是,如果您使用诸如/scratch/user42
之类的临时目录,那么您需要使用类似于就我个人而言,我在
config.yaml
中为cluster profile指定挂载,因此我不必再为额外的CLI参数而烦恼。~/.config/snakemake/[配置文件名称]/配置文件名称
无论何时使用
--profile [profile_name]
,都将包括此设置。