gpt4 book ai didi

python - 在 Snakemake 工作流程中作为输入的值数组

转载 作者:行者123 更新时间:2023-12-05 09:28:44 25 4
gpt4 key购买 nike

我开始将我的工作流程从 Nextflow 迁移到 Snakemake 并且在我的管道开始时已经碰壁了,这些管道通常以数字列表(代表来 self 们检测器的“运行编号”)。

例如,我有一个 run-list.txt 就像

# detector_id run_number
75 63433
75 67325
42 57584
42 57899
42 58998

然后需要将其逐行传递给查询数据库或数据存储系统并将文件检索到本地系统的进程。

这意味着例如75 63433 将通过接收 detector_id=75run_number=63433 的规则生成输出 RUN_00000075_00063433.h5 作为输入参数。

使用 Nextflow 这相当容易,只需定义一个进程来发出这些值的元组。

我不太明白如何在 Snakemake 中做这样的事情,因为输入和输出似乎总是需要文件(远程或本地)。事实上,有些文件确实可以通过 iRODS 和/或 XRootD 访问,但即便如此,我也需要先从运行选择开始,它在列表中定义,如 run-list.txt以上。

我现在的问题是:解决这个问题的 Snakemake 风格方法是什么?

无法工作的伪代码将是:

rule:
input:
[line for line in open("run-list.txt").readlines()]
output:
"{detector_id}_{run_number}.h5"
shell:
"detector_id, run_number = line.split()"
"touch "{detector_id}_{run_number}.h5""

最佳答案

在 Snakemake 中,您将使用此文件生成要输入工作流程的值列表。您将在规则之外解析检测器 ID 和运行编号。在我的脑海中,如果您想使用外部库,您的运行列表看起来可以用 pandas 巧妙地处理。

import pandas as pd

run_list = pd.read_csv("run-list.txt", header=0, names=["detector_id", "run_number"], sep=" ")
detector_ids = list(run_list["detector_id"])
run_numbers = list(run_list["run_number"])

然后,在假设您的文件名不需要需要用零填充的情况下,运行您想要获取一个文件的规则是:

rule do_something:
output: "{detector_id}_{run_number}.h5"
shell: "do_something_with {wildcards.detector_id} {wildcards.run_number}"

仅凭这条规则,detector_idrun_number 理论上可以是任何东西,所以你需要一些东西来告诉 Snakemake 以产生输出你想要的。要为文件中的所有 行运行此命令,您需要设置一个规则,将文件定义的所有潜在输出作为输入。

rule run_all:
input: expand("{detector_id}_{run_number}.h5", zip, detector_id=detector_ids, run_number=run_numbers)

使用 zip 部分确保第一个检测器 ID 与第一个运行编号一致,依此类推。

最后,您将运行它并指定要运行的规则的名称,因此 snakemake run_all

关于python - 在 Snakemake 工作流程中作为输入的值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71142612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com