MD任务与“蛇形制造”`

2024-10-01 17:32:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为分子动力学模拟创建一个非常简单的管道。该程序(琥珀色)只需要3个文件作为输入,并产生了很多文件,其中一些我将需要在未来。因此,我的管道非常简单:

  1. 检查*.in*.prmtop*.rst是否在文件夹中(我保证这些扩展名中只有一个文件),并在这些文件不存在时发出警告
  2. 运行shell命令(基于所有输入文件的名称)
  3. 检查是否产生了*.outmdenmdinfo*.nc

就这些。这是我处理项目的标准方法。一个文件夹,一个任务,基于文件目的而非内容的简短文件名

我写了一句简单的台词:

rule all:
    input: '{inp}.out'

rule amber:
    input:
        '{inp}.in',
        '{top}.prmtop',
        '{coord}.rst'
    output:
        '{inp}.out',
        'mden',
        'mdinfo',
        '{inp}.nc'
    shell:
        'pmemd.cuda'
        ' -O'
        ' -i {inp}.in'
        ' -o {inp}.out'
        ' -p {top}.prmtop'
        ' -c {coord}.rst'
        ' -r {inp}.rst'
        ' -x {inp}.nc'
        ' -ref {coord}.rst'

但它不起作用

  1. all规则中的所有输入必须是显式的。(为什么?为什么不能是regex或通配符表达式?如果我在文件夹中看到*.out,并且shell脚本的状态代码是0,就这样,工作完成了)
  2. 我必须在output中使用来自input的所有通配符,但我只想在shell或其他规则中使用一些通配符
  3. 我不能期望像mden这样的文件具有潜在的“非唯一”名称,因为它可能会随着另一个任务而改变,但我知道,它将只是一个任务,这是我的MD程序工作的直接方式(是的,我知道Ambers的-e-inf键,但这已经超过了简单任务的复杂性)

因此,我想决定是否值得为此使用snakemake。这是一项非常简单的任务,但我已经花了几个小时,我看到了很多文档,很多例子,我无法应用到我的案例中snakemake看起来正是我所需要的,但我不能用这个框架来表达一般意义上的简单任务,我不想指定显式的文件名,因为我会失去灵活性,我想自动运行数百个简单任务,只有输入文件会有所不同。我确信我还没有弄明白如何处理这个框架。也许你能告诉我该怎么做?谢谢大家!


Tags: 文件in程序文件夹input管道rstshell
1条回答
网友
1楼 · 发布于 2024-10-01 17:32:01

希望这将把你带向正确的方向

如果我理解正确,snakemake的输入是一个文件夹,其中包含amber的输入文件。您知道此文件夹包含一个.in文件、一个.prmtop文件和一个.rst文件,但您不知道这些文件的全名

如果您希望snakemake在单个输入文件夹上运行,那么您根本不需要通配符,下面的脚本就可以了

import glob
import os

input_folder = config['amber_folder']

# We don't know the name of input file. We only know it ends in '.in'
inp = glob.glob(os.path.join(input_folder, '*.in'))
assert len(inp) == 1
inp = inp[0]

name = os.path.splitext(os.path.basename(inp))[0]
output_folder = name + '_results'

out = os.path.join(output_folder, name + '.out')

rule all:
    input:
        out

rule amber:
    input:
        inp= inp,
        top= glob.glob(os.path.join(input_folder, '*.prmtop')),
        rst= glob.glob(os.path.join(input_folder, '*.rst')),
    output:
        out= out,
        nc= os.path.join(output_folder, name + '.nc'),
        mden= os.path.join(output_folder, 'mden'),
        mdinfo= os.path.join(output_folder, 'mdinfo'),
    shell:
        r"""
        pmemd.cuda \
         -O \
         -i {input.inp} \
         -o {output.out} \
         -p {input.top} \
         -c {input.rst} \
         -r {input.rst} \
         -x {output.nc} \
         -ref {input.rst}
        """

执行时:

snakemake -j 1 -C amber_folder='your-input-folder'

如果您有许多输入文件夹,您可以编写for循环来执行上面的命令,但最好是将输入列表传递给snakemake并让它处理它们

相关问题 更多 >

    热门问题