Skip to main content

操作DeePMD-kit、VASP、QE、PWmat、LAMMPS等数据格式。

项目描述

dpdata是一个 python 包,用于处理计算科学中软件的数据格式,包括 DeePMD-kit、VASP、LAMMPS、GROMACS、Gaussian。dpdata 仅适用于 python 3.x。

安装

可以通过以下方式下载 dpdata 的源代码

git clone https://github.com/deepmodeling/dpdata.git dpdata

然后用于setup.py安装模块

cd dpdata
python setup.py install

dpdata也可以通过 pip 安装

pip3 install dpdata

快速开始

本节给出了一些关于 dpdata 如何工作的示例。首先需要在 python 3.x 兼容代码中导入模块。

import dpdata

的典型工作流程dpdata

  1. 从 vasp 或 lammps 或 deepmd-kit 数据文件加载数据。
  2. 操作数据
  3. 以所需格式转储数据

加载数据

d_poscar = dpdata.System('POSCAR', fmt = 'vasp/poscar')

或者让 dpdatavasp/poscar从文件扩展名中推断出文件的格式( )

d_poscar = dpdata.System('my.POSCAR')

原子数、原子类型、坐标从 加载POSCAR并存储到System名为的数据d_poscar中。数据Systemdeepmd-kit使用的概念)包含具有相同数量的相同类型的原子的帧。原子的顺序在 one 中的帧之间应该是一致的System。请注意,POSCAR仅包含一帧。如果需要存储在例如 a 中的多个帧OUTCAR

d_outcar = dpdata.LabeledSystem('OUTCAR')

中提供的标签OUTCAR,即能量、力和维里尔(如果有)由 加载LabeledSystem。值得注意的是,原子的力总是被假定存在的。LabeledSystem是 的派生类System

SystemorLabeledSystem可以从以下文件格式构造,表format key中的 传递给参数fmt

软件 格式 多帧 贴上标签 班级 格式键
瓦斯普 波斯卡 错误的 错误的 系统 '瓦斯普/波斯卡'
瓦斯普 外车 真的 真的 标签系统 'vasp/outcar'
瓦斯普 xml 真的 真的 标签系统 '瓦斯/xml'
lmp 错误的 错误的 系统 '灯/lmp'
倾倒 真的 错误的 系统 '灯/转储'
深度学习 生的 真的 错误的 系统 “深度/原始”
深度学习 npy 真的 错误的 系统 'deepmd/npy'
深度学习 生的 真的 真的 标签系统 “深度/原始”
深度学习 npy 真的 真的 标签系统 'deepmd/npy'
高斯 日志 错误的 真的 标签系统 '高斯/对数'
高斯 日志 真的 真的 标签系统 '高斯/md'
午休 输出 错误的 真的 标签系统 '午睡/输出'
午休 目标输出 真的 真的 标签系统 '午睡/目标输出'
cp2k 输出 错误的 真的 标签系统 'cp2k/输出'
cp2k 目标输出 真的 真的 标签系统 'cp2k/aimd_output'
量化宽松 日志 错误的 真的 标签系统 'qe/pw/scf'
量化宽松 日志 真的 错误的 系统 'qe/cp/traj'
量化宽松 日志 真的 真的 标签系统 'qe/cp/traj'
目标 输出 真的 真的 标签系统 'fhi_aims/md'
目标 输出 错误的 真的 标签系统 'fhi_aims/scf'
俏皮话/差距 xyz 真的 真的 多系统 '俏皮话/差距/ xyz'
脉宽 atom.config 错误的 错误的 系统 'pwmat/atom.config'
脉宽 移动 真的 真的 标签系统 'pwmat/运动'
脉宽 OUT.MLMD 真的 真的 标签系统 'pwmat/out.mlmd'
琥珀色 真的 真的 标签系统 '琥珀色/md'
琥珀色/平方米 平方米。 错误的 错误的 系统 '平方米/出'
格罗麦克斯 格罗 真的 错误的 系统 'gromacs/gro'
算盘 斯特鲁 错误的 真的 标签系统 '算盘/scf'
算盘 到岸价 真的 真的 标签系统 '算盘/md'
算盘 斯特鲁 真的 真的 标签系统 '算盘/放松'
结构体 真的 真的 多系统 'ase/结构'

该类dpdata.MultiSystems 可以从可能包含不同系统的许多文件的目录中读取数据,或者从包含不同系统的单个 xyz 文件中读取数据。

用于dpdata.MultiSystems.from_dir从目录中读取,dpdata.MultiSystems将递归地进入目录并查找具有特定文件名的所有文件。支持所有支持的文件格式dpdata.LabeledSystem

用于 dpdata.MultiSystems.from_file从单个文件中读取。quip/gap/xyzase/structure格式提供单文件支持。

例如,对于quip/gap xyz文件,单个 .xyz 文件可能包含许多具有不同原子数和原子类型的不同配置。

以下相关的命令Class dpdata.MultiSystems可能有用。

# load data

xyz_multi_systems = dpdata.MultiSystems.from_file(file_name='tests/xyz/xyz_unittest.xyz',fmt='quip/gap/xyz')
vasp_multi_systems = dpdata.MultiSystems.from_dir(dir_name='./mgal_outcar', file_name='OUTCAR', fmt='vasp/outcar')

# use wildcard
vasp_multi_systems = dpdata.MultiSystems.from_dir(dir_name='./mgal_outcar', file_name='*OUTCAR', fmt='vasp/outcar')

# print the multi_system infomation
print(xyz_multi_systems)
print(xyz_multi_systems.systems) # return a dictionaries

# print the system infomation
print(xyz_multi_systems.systems['B1C9'].data)

# dump a system's data to ./my_work_dir/B1C9_raw folder
xyz_multi_systems.systems['B1C9'].to_deepmd_raw('./my_work_dir/B1C9_raw')

# dump all systems
xyz_multi_systems.to_deepmd_raw('./my_deepmd_data/')

您还可以使用以下代码来解析多系统:

from dpdata import LabeledSystem,MultiSystems
from glob import glob
"""
process multi systems
"""
fs=glob('./*/OUTCAR')  # remeber to change here !!!
ms=MultiSystems()
for f in fs:
    try:
        ls=LabeledSystem(f)
    except:
        print(f)
    if len(ls)>0:
        ms.append(ls)

ms.to_deepmd_raw('deepmd')
ms.to_deepmd_npy('deepmd')

访问数据

这些属性存储在操作员中,System并且LabeledSystem可以由操作员[]使用提供的属性的键进行访问,例如

coords = d_outcar['coords']

可用的属性是(nframe:系统中的帧数,natoms:系统中的原子总数)

钥匙 类型 方面 是标签 描述
'atom_names' str 列表 类型 错误的 每个原子类型的名称
'atom_numbs' 整数列表 类型 错误的 每种原子类型的原子数
'atom_types' np.ndarray 解剖学 错误的 为每个原子分配类型的数组
'细胞' np.ndarray 帧数 x 3 x 3 错误的 每帧的cell张量
'坐标' np.ndarray nframes x natoms x 3 错误的 原子坐标
“能量” np.ndarray 真的 框架能量
'军队' np.ndarray nframes x natoms x 3 真的 原子力
'virials' np.ndarray 帧数 x 3 x 3 真的 每帧的维里张量

转储数据

以“lammps/lmp”或“vasp/poscar”格式存储SystemLabeledSystem可以转储的数据,例如:

d_outcar.to('lammps/lmp', 'conf.lmp', frame_idx=0)

的第一帧d_outcar将被转储到“conf.lmp”

d_outcar.to('vasp/poscar', 'POSCAR', frame_idx=-1)

的最后一帧d_outcar将被转储到“POSCAR”。

存储的数据LabeledSystem可以转储为 deepmd-kit 原始格式,例如

d_outcar.to('deepmd/raw', 'dpmd_raw')

或者更简单的命令:

dpdata.LabeledSystem('OUTCAR').to('deepmd/raw', 'dpmd_raw')

帧选择可以通过

dpdata.LabeledSystem('OUTCAR').sub_system([0,-1]).to('deepmd/raw', 'dpmd_raw')

仅将第一帧和最后一帧转储到dpmd_raw.

复制

dpdata 将创建当前原子配置的超级单元。

dpdata.System('./POSCAR').replicate((1,2,3,) )

tuple(1,2,3) 表示不在 x 方向复制原子配置,在 y 方向复制 2 个,在 z 方向复制 3 个。

扰动

通过以下示例,原始系统(dpdata.System('./POSCAR'))的每一帧都被扰动以生成三个新帧。对于每一帧,单元受到 5% 的扰动,原子位置受到 0.6 埃的扰动。atom_pert_style表明对原子位置的扰动服从正态分布。其他可用选项atom_pert_styleuniform(在球上均匀)和const(在球上均匀)。

perturbed_system = dpdata.System('./POSCAR').perturb(pert_num=3, 
    cell_pert_fraction=0.05, 
    atom_pert_distance=0.6, 
    atom_pert_style='normal')
print(perturbed_system.data)

代替

通过以下示例,系统中的随机 8 个 Hf 原子将被 Zr 原子替换,原子位置不变。

s=dpdata.System('tests/poscars/POSCAR.P42nmc',fmt='vasp/poscar')
s.replace('Hf', 'Zr', 8)
s.to_vasp_poscar('POSCAR.P42nmc.replace')

债券订单系统

dpdata 中引入了一个BondOrderSystem从类继承的新类。System这个新类包含化学键和正式电荷的信息(存储在BondOrderSystem.data['bonds'],中BondOrderSystem.data['formal_charges'])。现在 BondOrderSystem 只能读取 .mol/.sdf 格式,因为它依赖于 rdkit(这意味着如果你想使用这个功能必须安装 rdkit)。其他格式,例如 pdb,必须转换为 .mol/.sdf 格式(可能使用 open babel 之类的软件)。

import dpdata
system_1 = dpdata.BondOrderSystem("tests/bond_order/CH3OH.mol", fmt="mol") # read from .mol file
system_2 = dpdata.BondOrderSystem("tests/bond_order/methane.sdf", fmt="sdf") # read from .sdf file

在 sdf 文件中,所有分子必须具有相同的拓扑结构(即具有相同分子构型的构象异构体)。 BondOrderSystem还支持直接从rdkit.Chem.rdchem.Mol对象初始化。

 rdkit 导入 化学
 rdkit.Chem 导入 AllChem
import dpdata

摩尔 = 化学MolFromSmiles ( "CC" ) 
mol  =  Chem . AddHs ( mol ) 
AllChem EmbedMultipleConfs ( mol ,  10 )
系统 =  dpdata BondOrderSystem ( rdkit_mol = mol )

债券订单分配

如. BondOrderSystem_ dpdata.rdkit.santizie.Sanitizer此类定义了 3 个级别的消毒过程:低、中和高。(默认为中)。

  • 低:使用rdkit.Chem.SanitizeMol()功能对分子进行消毒。
  • medium:在使用 rdkit 之前,程序将首先分配每个原子的正式电荷以避免不适当的化合价异常。然而,这种模式需要给定分子中键序信息的正确性。
  • 高:程序将尝试修复芳族杂环、磷酸盐、硫酸盐、羧基、硝基、硝基、胍基团中不适当的键顺序。如果此程序未能对给定分子进行消毒,则程序将尝试调用obabel对分子进行预处理并重复消毒程序。也就是说,如果你不想使用这个级别的清理,请确保obabel安装在环境中。 根据我们的测试,我们的消毒程序可以成功读取 PDBBind-refined-set 中的 4852 个小分子。需要指出的是,在分子文件(mol/sdf)中,显式氢的数量必须是正确的。因此,我们建议使用 obabel xxx -O xxx -h对文件进行预处理。我们之所以没有在dpdata中实现这个加氢过程,是因为我们无法保证它的正确性。
import dpdata
    
对于 glob中的sdf_file  glob “bond_order/refined-set-ligands/obabel/*sdf” ):syst = dpdata BondOrderSystem ( sdf_file , sanitize_level = 'high' , verbose = False ) 
        

正式收费分配

BondOrderSystem 实现了一种基于 8 电子规则为每个原子分配正式电荷的方法(见下文)。请注意,它仅支持生物系统中的常见元素:B、C、N、O、P、S、As

import dpdata

 系统=  dpdata BondOrderSystem ( "tests/bond_order/CH3NH3+.mol" , fmt = 'mol' ) print ( syst . get_formal_charges () ) # 返回每个原子的正式电荷print ( syst . get_charge ()) # 返回系统的总电荷 
 
 

如果在碳上检测到化合价为 3,则正式电荷将分配为 -1。因为在大多数情况下(在炔基阴离子、异腈、环戊二烯基阴离子中),3 价碳上的形式电荷为 -1,这也符合 8 电子规则。

插件

可以按照一个简单的示例通过创建和安装插件来添加自己的格式。将Format类添加到entry_points['dpdata.plugins']in至关重要setup.py

    entry_points={
        'dpdata.plugins': [
            'random=dpdata_random:RandomFormat'
        ]
    },

项目详情