操作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
是
- 从 vasp 或 lammps 或 deepmd-kit 数据文件加载数据。
- 操作数据
- 以所需格式转储数据
加载数据
d_poscar = dpdata.System('POSCAR', fmt = 'vasp/poscar')
或者让 dpdatavasp/poscar
从文件扩展名中推断出文件的格式( )
d_poscar = dpdata.System('my.POSCAR')
原子数、原子类型、坐标从 加载POSCAR
并存储到System
名为的数据d_poscar
中。数据System
(deepmd-kit使用的概念)包含具有相同数量的相同类型的原子的帧。原子的顺序在 one 中的帧之间应该是一致的System
。请注意,POSCAR
仅包含一帧。如果需要存储在例如 a 中的多个帧OUTCAR
,
d_outcar = dpdata.LabeledSystem('OUTCAR')
中提供的标签OUTCAR
,即能量、力和维里尔(如果有)由 加载LabeledSystem
。值得注意的是,原子的力总是被假定存在的。LabeledSystem
是 的派生类System
。
System
orLabeledSystem
可以从以下文件格式构造,表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/xyz
和ase/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”格式存储System
或LabeledSystem
可以转储的数据,例如:
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_style
是uniform
(在球上均匀)和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'
]
},