我正在尝试学习snakemake并实现一个简单的工作流程:
我正在运行以下蛇文件
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 个命令
这不是最好的答案,但一种选择是动态定义规则:
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}"
注意,应该可以创建单个规则(而不是动态创建多个规则),但正确实现它需要更多时间(可能还需要更多细节)。