问题描述
我有一个带有调用其他程序和自定义 R 和 python 脚本的规则的蛇形管道。
我有多个数据集,需要在这些数据集上运行相同的管道。通常我会为每个数据集创建一个单独的文件夹,并放置一个特定于数据集的配置文件并单独运行。
由于这次我有 20 多个数据集,我想知道是否有更自动化的方法来做到这一点。数据集之间主要有 4 个变化的参数:输入文件位置、引物、质量控制参数和结果的输出目录。 有没有办法让“主”配置文件包含有关这 4 个参数的信息和一个蛇文件,然后调用第二个蛇文件的次数与数据集的数量一样多?
这整个想法对我来说似乎是一个 for 循环,它循环遍历这 4 个参数的数组,但我不知道如何在 snakemake 中实现它。
欢迎任何建议和想法! 谢谢 河南
解决方法
假设所有参数在输出文件名中都有些“编码”,我认为这可以使用单个蛇文件来完成。
您的主配置文件将包含每个数据集的部分,该部分可以包含所需的输出目录以及特定于该数据集的配置文件的路径。
概念证明:
Snakefile
:
import yaml
datasets = list(config.keys())
results = []
for dataset in datasets:
out_dir = config[dataset]["out_dir"]
with open(config[dataset]["conf"]) as conf_fh:
dat_conf = yaml.safe_load(conf_fh)
p1 = dat_conf["p1"]
p2 = dat_conf["p2"]
p3 = dat_conf["p3"]
p4 = dat_conf["p4"]
results.append(f"{out_dir}/{p1}_{p2}_{p3}_{p4}.out")
rule all:
input:
results
rule make_output:
output:
"{out_dir}/{p1}_{p2}_{p3}_{p4}.out"
shell:
"touch {output[0]}"
main_config.yaml
:
dat1:
out_dir: "dat1"
conf: "dat1_conf.yaml"
dat2:
out_dir: "dat2"
conf: "dat2_conf.yaml"
dat1_conf.yaml
:
p1: "A"
p2: "a"
p3: "1"
p4: "01"
dat2_conf.yaml
:
p1: "B"
p2: "b"
p3: "2"
p4: "02"
可以执行,例如,如下:
snakemake --snakefile Snakefile --configfile main_config.yaml -j 2
这将创建以下结果文件:
dat1/A_a_1_01.out
dat2/B_b_2_02.out