在snakemake中执行字符串对和输出的规则

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

我正在尝试学习snakemake并实现一个简单的工作流程:

  1. 读取文件中的所有行
  2. 对每一行执行一个 shell 命令
  3. 将输出重定向到单独的文件

我正在运行以下蛇文件

configfile: "config.yaml"

smiles = []
with open(config["smiles_file"]) as f:
    smiles = f.read().splitlines()

rule geometry_from_smiles:
    input: config["smiles_file"]
    output: 
        xyz=expand("results/starting_geometries/{fname}.xyz", fname=[f"{i+1}" for i in range(0, len(smiles))])
    shell:
        "obabel -:'{smiles}' -oxyz -h --gen3D > {output.xyz}"

但是在试运行中我发现

obabel -:'c1ccccc1 Oc1ccccc1 Nc1ccccc1' -oxyz -h --gen3D > results/starting_geometries/1.xyz results/starting_geometries/2.xyz results/starting_geometries/3.xyz

作为要执行的 shell 命令,而不是每对输入和输出执行 3 个命令

python python-3.x shell snakemake
1个回答
0
投票

这不是最好的答案,但一种选择是动态定义规则:

configfile: "config.yaml"

smiles = []
with open(config["smiles_file"]) as f:
    smiles = f.read().splitlines()

output_names = [f"results/starting_geometries/{num_smile+1}.xyz" for num_smile, _ in enumerate(smiles, start=1)]

rule_all:
   input: output_names

for smile, output_file in zip(smiles, output_names):
   rule:
       input: smile
       output: output_file
    shell:
        "obabel -:'{input}' -oxyz -h --gen3D > {output}"

注意,应该可以创建单个规则(而不是动态创建多个规则),但正确实现它需要更多时间(可能还需要更多细节)。

© www.soinside.com 2019 - 2024. All rights reserved.