微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为多个数据集运行一条蛇形管道

如何解决为多个数据集运行一条蛇形管道

我有一个带有调用其他程序和自定义 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

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