Snakemake:使用多个输入文件处理样本的管道

问题描述 投票:0回答:1

我是 Snakemake 的新手,在完成本教程后,我尝试将自己的管道组合在一起,但在尝试创建管道来处理具有多个输入文件的样本时遇到了一些问题。我正在尝试创建一个执行以下步骤的管道:

  1. 读取示例目录中存在的所有输入文件(例如 data/experiment/sample/),并在每个文件上运行 python 脚本,将输出文件生成到结果目录中(例如 results/experiment/sample/)
  2. 将结果目录中存在的所有结果文件合并到一个文件中(例如 results/experiment/sample/merged.txt)

我正在使用的示例目录结构如下(每个样本的文件总数可能因样本而异):

data
    experiment
        Sample_1
            Sample_1_0.txt
            Sample_1_1.txt
            Sample_1_2.txt

我现在的配置文件如下(尝试为单个示例运行管道):

exp_dir: experiment
sample: Sample_1
distance: 450
max_wavelength: 710
min_wavelength: 575

我尝试组合的管道在我的 Snakefile 中如下:

configfile: "config.yaml"

EXP_DIR=config["exp_dir"]
SAMPLE=config["sample"]
FINAL_FILE=f"results/{EXP_DIR}/{SAMPLE}/{SAMPLE}_complete.txt"

wcs = glob_wildcards("data" + "/"  + EXP_DIR + "/" + SAMPLE + "/" + SAMPLE + "_{rep}.txt")

rule all:
    input:
        FINAL_FILE

rule detect_peaks:
    input:
        "data" + "/"  + EXP_DIR + "/" + SAMPLE + "/" + SAMPLE + "_{rep}.txt"
    output:
        "results/" + EXP_DIR + "/" + SAMPLE + "/" + SAMPLE + "_{rep}.txt"
    params:
        distance=config["distance"],
        max_wavelength=config["max_wavelength"],
        min_wavelength=config["min_wavelength"]
    shell:
        "python scripts/peak_detection.py -i {input} -o {output} -d {params.distance} "
        "-m {params.min_wavelength} -x {params.max_wavelength}"


rule agg_files:
    input:
        expand("data/results" + "/"  + EXP_DIR + "/" + SAMPLE + "/" + SAMPLE + "_{rep}.txt", ts=wcs["rep"])
    output:
        FINAL_FILE
    output:
        "python scripts/combine_peaks.py -i {input} -o {output}"

当我在运行管道之前尝试构建 DAG 时,出现以下错误:
文件 XXXX 第 29 行出现类型错误:
元组索引必须是整数或切片,而不是 str

任何有关如何解决此问题或改进我的管道的帮助/建议将不胜感激!

snakemake
1个回答
0
投票

具体错误是由于您访问

wcs
内容的方式造成的。应该是
wcs.rep
而不是
wcs["rep"]
,底层结构是一个元组,而不是一个字典。

你的蛇文件的其余部分都可以工作,但这里有一些风格提示:

  • 仅使用实验路径替换 exp_dir 示例设置。我喜欢将它们保留在配置中的
    paths
    键下。所以你的配置是:
paths:
  raw_data: "data/experiment/Sample_1/Sample_1_{rep}.txt"
  output: "results/experiment/Sample_1/Sample_1_complete.txt"

它更灵活,因为用户可以稍后决定他们想要更改文件树,并且它仍然可以工作。您还可以更轻松地添加通配符,假设您有多个实验和样本。您可以对所有这些进行 glob_wildcards 并展开(使用 zip!),一切都会基本相同。

  • 忽略这一点,考虑使用 f 字符串或
    os.path.join
    来创建文件名。
 "data" + "/"  + EXP_DIR + "/" + SAMPLE + "/" + SAMPLE + "_{rep}.txt"
 # vs
 f"data/{EXP_DIR}/{SAMPLE}/{SAMPLE}_{{rep}}.txt"
 # or
 os.path.join("data", EXP_DIR, SAMPLE, SAMPLE + "_{rep}.txt")
  • 不需要使用params传入配置值,直接使用即可:
-x {params.max_wavelength}
# vs
-x {config[max_wavelength]}
  • 不要使用 shell 指令,而是考虑使用
    script
    指令来简化蛇形变量的传递。如果您这样做,请忽略我之前的建议。
© www.soinside.com 2019 - 2024. All rights reserved.