dpdata

dpdata

Python工具包实现计算科学软件数据格式的灵活处理

dpdata是一个面向计算科学软件的Python工具包,支持多种数据格式如DeePMD-kit、VASP和LAMMPS等。该工具包提供数据加载、操作和导出功能,可处理单帧和多帧系统数据,支持标记和非标记系统。dpdata具备丰富的数据访问和转换方法,同时支持原子系统的复制、扰动和替换,以及化学键和形式电荷的处理。

dpdata计算科学数据格式Python包DeePMD-kitGithub开源项目

dpdata

conda-forge pip install 文档状态

dpdata是一个用于处理计算科学软件数据格式的Python包,包括DeePMD-kit、VASP、LAMMPS、GROMACS和Gaussian。 dpdata仅适用于Python 3.7及以上版本。

安装

可以通过以下命令下载dpdata的源代码:

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

然后使用pip从源代码安装模块:

cd dpdata pip install .

也可以直接通过pip安装dpdata,无需下载源代码:

pip install dpdata

快速入门

本节提供一些dpdata使用示例。首先需要在Python 3.x兼容的代码中导入模块。

import dpdata

dpdata的典型工作流程为:

  1. 从VASP、LAMMPS或DeePMD-kit数据文件加载数据。
  2. 操作数据
  3. 将数据以所需格式导出

加载数据

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

或者让dpdata根据文件名扩展名推断文件格式(vasp/poscar

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

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

d_outcar = dpdata.LabeledSystem("OUTCAR")

OUTCAR中提供的标签,即能量、力和应力(如果有)由LabeledSystem加载。需要注意的是,原子的力始终被假定存在。LabeledSystemSystem的派生类。

SystemLabeledSystem可以从以下文件格式构建,表中的格式关键字作为fmt参数传递:

软件格式多帧已标记类别格式键
vaspposcarSystem'vasp/poscar'
vaspoutcarLabeledSystem'vasp/outcar'
vaspxmlLabeledSystem'vasp/xml'
lammpslmpSystem'lammps/lmp'
lammpsdumpSystem'lammps/dump'
deepmdrawSystem'deepmd/raw'
deepmdnpySystem'deepmd/npy'
deepmdrawLabeledSystem'deepmd/raw'
deepmdnpyLabeledSystem'deepmd/npy'
deepmdnpyMultiSystems'deepmd/npy/mixed'
deepmdnpyMultiSystems'deepmd/npy/mixed'
gaussianlogLabeledSystem'gaussian/log'
gaussianlogLabeledSystem'gaussian/md'
siestaoutputLabeledSystem'siesta/output'
siestaaimd_outputLabeledSystem'siesta/aimd_output'
cp2k(未来将弃用)outputLabeledSystem'cp2k/output'
cp2k(未来将弃用)aimd_outputLabeledSystem'cp2k/aimd_output'
cp2k(插件)stdoutLabeledSystem'cp2kdata/e_f'
cp2k(插件)stdoutLabeledSystem'cp2kdata/md'
QElogLabeledSystem'qe/pw/scf'
QElogSystem'qe/cp/traj'
QElogLabeledSystem'qe/cp/traj'
Fhi-aimsoutputLabeledSystem'fhi_aims/md'
Fhi-aimsoutputLabeledSystem'fhi_aims/scf'
quip/gapxyzMultiSystems'quip/gap/xyz'
PWmatatom.configSystem'pwmat/atom.config'
PWmatmovementLabeledSystem'pwmat/movement'
PWmatOUT.MLMDLabeledSystem'pwmat/out.mlmd'
AmbermultiLabeledSystem'amber/md'
Amber/sqmsqm.outSystem'sqm/out'
GromacsgroSystem'gromacs/gro'
ABACUSSTRUSystem'abacus/stru'
ABACUSSTRULabeledSystem'abacus/scf'
ABACUScifLabeledSystem'abacus/md'
ABACUSSTRULabeledSystem'abacus/relax'
asestructureMultiSystems'ase/structure'
DFTB+dftbplusLabeledSystem'dftbplus'
n2p2n2p2LabeledSystem'n2p2'

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 相关的命令可能有用。

# 加载数据 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" ) # 使用通配符 vasp_multi_systems = dpdata.MultiSystems.from_dir( dir_name="./mgal_outcar", file_name="*OUTCAR", fmt="vasp/outcar" ) # 打印多系统信息 print(xyz_multi_systems) print(xyz_multi_systems.systems) # 返回字典 # 打印系统信息 print(xyz_multi_systems.systems["B1C9"].data) # 将系统数据导出到 ./my_work_dir/B1C9_raw 文件夹 xyz_multi_systems.systems["B1C9"].to_deepmd_raw("./my_work_dir/B1C9_raw") # 导出所有系统 xyz_multi_systems.to_deepmd_raw("./my_deepmd_data/")

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

from dpdata import LabeledSystem, MultiSystems from glob import glob 处理多个系统 ```python fs = glob("./*/OUTCAR") # 记得在这里修改!!! 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")

访问数据

存储在SystemLabeledSystem中的这些属性可以通过操作符[]加上属性的键来访问,例如

coords = d_outcar["coords"]

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

类型维度是否标签描述
'atom_names'字符串列表ntypes每种原子类型的名称
'atom_numbs'整数列表ntypes每种原子类型的原子数量
'atom_types'np.ndarraynatoms为每个原子分配类型的数组
'cells'np.ndarraynframes x 3 x 3每帧的晶胞张量
'coords'np.ndarraynframes x natoms x 3原子坐标
'energies'np.ndarraynframes帧能量
'forces'np.ndarraynframes x natoms x 3原子受力
'virials'np.ndarraynframes x 3 x 3每帧的维里张量

导出数据

存储在SystemLabeledSystem中的数据可以以'lammps/lmp'或'vasp/poscar'格式导出,例如:

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, ) )

元组(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")

BondOrderSystem

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" ) # 从.mol文件读取 system_2 = dpdata.BondOrderSystem( "tests/bond_order/methane.sdf", fmt="sdf" ) # 从.sdf文件读取

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

from rdkit import Chem from rdkit.Chem import AllChem import dpdata mol = Chem.MolFromSmiles("CC") mol = Chem.AddHs(mol) AllChem.EmbedMultipleConfs(mol, 10) system = dpdata.BondOrderSystem(rdkit_mol=mol)

键序分配

BondOrderSystem实现了一个更加健壮的rdkit Mol净化程序,定义在dpdata.rdkit.santizie.Sanitizer中。该类定义了三个级别的净化过程:低、中、高(默认为中级)。

  • 低级:使用rdkit.Chem.SanitizeMol()函数来净化分子。
  • 中级:在使用rdkit之前,程序会先为每个原子分配形式电荷,以避免不适当的价态异常。然而,这种模式要求给定分子中的键序信息正确无误。
  • 高级:程序将尝试修复芳香杂环、磷酸盐、硫酸盐、羧基、硝基、亚硝基、胍基中不适当的键序。如果这个程序无法净化给定的分子,程序将尝试调用obabel来预处理分子并重复净化程序。也就是说,如果你想使用这个级别的净化,请确保环境中已安装obabel 根据我们的测试,我们的净化程序可以成功读取PDBBind精炼集中的4852个小分子。需要指出的是,在分子文件(mol/sdf)中,显式氢原子的数量必须正确。因此,我们建议使用obabel xxx -O xxx -h来预处理文件。我们没有在dpdata中实现这个加氢程序的原因是我们无法保证其正确性。
import dpdata for sdf_file in glob.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 syst = dpdata.BondOrderSystem("tests/bond_order/CH3NH3+.mol", fmt="mol") print(syst.get_formal_charges()) # 返回每个原子的形式电荷 print(syst.get_charge()) # 返回系统的总电荷

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

混合类型格式

deepmd/npy/mixed格式是DeePMD-kit的混合类型numpy格式,可以通过dpdata.MultiSystems类加载或导出。

在这种格式下,具有相同原子数量但不同分子式的系统可以被放在一起组成一个更大的系统,尤其是当系统中的帧数稀疏时。

这也有助于将类型信息混合在一起,用于带有类型嵌入网络的模型训练。

以下是使用deepmd/npy/mixed格式的示例:

  • 将MultiSystems导出到混合类型的numpy目录:
import dpdata dpdata.MultiSystems(*systems).to_deepmd_npy_mixed("mixed_dir")
  • 将混合类型数据加载到MultiSystems中:
import dpdata dpdata.MultiSystems().load_systems_from_file("mixed_dir", fmt="deepmd/npy/mixed")

插件

可以参照一个简单的示例通过创建和安装插件来添加自己的格式。关键是要在pyproject.toml中将Format类添加到entry_points['dpdata.plugins']中:

[project.entry-points.'dpdata.plugins'] random = "dpdata_random:RandomFormat"

编辑推荐精选

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
问小白

问小白

全能AI智能助手,随时解答生活与工作的多样问题

问小白,由元石科技研发的AI智能助手,快速准确地解答各种生活和工作问题,包括但不限于搜索、规划和社交互动,帮助用户在日常生活中提高效率,轻松管理个人事务。

热门AI助手AI对话AI工具聊天机器人
Transly

Transly

实时语音翻译/同声传译工具

Transly是一个多场景的AI大语言模型驱动的同声传译、专业翻译助手,它拥有超精准的音频识别翻译能力,几乎零延迟的使用体验和支持多国语言可以让你带它走遍全球,无论你是留学生、商务人士、韩剧美剧爱好者,还是出国游玩、多国会议、跨国追星等等,都可以满足你所有需要同传的场景需求,线上线下通用,扫除语言障碍,让全世界的语言交流不再有国界。

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

下拉加载更多