我是 Snakemake 的新手,在完成本教程后,我尝试将自己的管道组合在一起,但在尝试创建管道来处理具有多个输入文件的样本时遇到了一些问题。我正在尝试创建一个执行以下步骤的管道:
我正在使用的示例目录结构如下(每个样本的文件总数可能因样本而异):
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
任何有关如何解决此问题或改进我的管道的帮助/建议将不胜感激!
具体错误是由于您访问
wcs
内容的方式造成的。应该是wcs.rep
而不是wcs["rep"]
,底层结构是一个元组,而不是一个字典。
你的蛇文件的其余部分都可以工作,但这里有一些风格提示:
paths
键下。所以你的配置是:paths:
raw_data: "data/experiment/Sample_1/Sample_1_{rep}.txt"
output: "results/experiment/Sample_1/Sample_1_complete.txt"
它更灵活,因为用户可以稍后决定他们想要更改文件树,并且它仍然可以工作。您还可以更轻松地添加通配符,假设您有多个实验和样本。您可以对所有这些进行 glob_wildcards 并展开(使用 zip!),一切都会基本相同。
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")
-x {params.max_wavelength}
# vs
-x {config[max_wavelength]}
script
指令来简化蛇形变量的传递。如果您这样做,请忽略我之前的建议。