qmof介绍,matdeeplearn MOFS 转图数据 附带pymatgen, vasp
QMOF
QMOF是目前最全面的mof数据库,对应有平台https://next-gen.materialsproject.org/
MatDeepLearn 是目前包含QMOF的第一个材料化学GNN baseline框架。vxfung/MatDeepLearn: MatDeepLearn, package for graph neural networks in materials chemistry (github.com)
本文先对qmof的文档中的数据标准(Version History - Materials Project Documentation)进行整理;然后对代码中( qmof:https://github.com/arosen93/QMOF ) 的抽取mofs结构图数据的方法进行分析。最后对MatDL框架的图数据标准进行分析。。
后续工作包括从CSD即其它数据集上下载更多的数据,理解CIF文件结构与内容,定义我们的MOFS结构图数据标准。
QMOF的数据来源
数据筛选准则:QMOF为了保证数据 DFT-ready 进行去重、去非法结构,为了保证DFT的效率,约束300个原子以下。
数据源:CDS&CORE等9个数据库(Structure Sources - Materials Project Documentation),更新致20376个数据 2021/12/8
其它数据库简介:
Pyrene MOFs:实验表征的含芘 MOF。 Materials Cloud.
(以下都是hMOFs)
TOBACCO :根据构造单元生成hMOF。 Topology-Based Crystal Constructor (ToBaCCo) code
Anderson and Gómez-Gualdrón dataset : TOBACCO 生成的hMOF
Woo& Boyd et al. TOBACCO 生成的hMOF Materials Cloud.
Genomic MOF Database: hMOFs, available on Figshare
Hypothetical MOF-74s,Hypothetical MOF-74s: hMOFS, here
QMOF的标准字段
QMOF-ID:qmof-七位16进制 qmof-1abcd2。不同的id有不同的原始单元晶格。不同的依据是 Pymatgen's StructureMatcher.
MOF-ID: SMILE表达式SMILES(一串字符来描述一个三维化学结构)_百度百科 (baidu.com),用于mof检索,(也可用DOI,CSD refcode)。通过SMILE算法生成。
拓扑结构:点数、边数、构造单元连通性等。通过MOF-ID在 Reticular Chemistry Structure Resource. 上检索得到,该网站包含数千个拓扑结构。
一下是量子性质:(标签)
带隙:通过 Pymatgen's EIGENVAL parser得到。
partial atomic charges,multiple magnetic properties,Bond orders,Density of states,孔隙几何性质。
VASP setting:DFT的参数。
cif文件转图数据
该方法利用pymatgen,ASE 库解析cif文件得到mofs的原子结构(包括邻居和空间信息)。基于该结构,用距离阈值定义化学键,最后使用n最近邻建图。
输出
- 2个邻接表,表示单个mofs原子间的连接关系。(邻居id存一个表,属性另一个表;取最近邻的操作保证表格列数相同)
- 每个节点的特征向量。
- 整张图的标签和id。
输入
数据文件夹root_dir有如下结构:
root_dir
├── id_prop.csv
├── atom_init.json
├── id0.cif
├── id1.cif
├── ...
其中 id0是cif文件。
CIF的语法较复杂,完整cif文件包含的内容很多。其中各项含义可见CIF文件详解 - 百度文库 (baidu.com), 官方文档(IUCr) A guide to CIF for authors。
data_image0
_cell_length_a 16.991
_cell_length_b 16.991
_cell_length_c 16.991
_cell_angle_alpha 90
_cell_angle_beta 90
_cell_angle_gamma 90
_symmetry_space_group_name_H-M "P 1"
_symmetry_int_tables_number 1
loop_
_symmetry_equiv_pos_as_xyz
'x, y, z'
loop_
_atom_site_label
_atom_site_occupancy
_atom_site_fract_x
_atom_site_fract_y
_atom_site_fract_z
_atom_site_thermal_displace_type
_atom_site_B_iso_or_equiv
_atom_site_type_symbol
C1 1.0000 0.37705 0.00790 0.62295 Biso 1.000 C
C2 1.0000 0.36851 0.89914 0.68750 Biso 1.000 C
H1 1.0000 0.37770 0.85890 0.72340 Biso 1.000 H
C3 1.0000 0.40610 0.08550 0.59390 Biso 1.000 C
N1 1.0000 0.40973 0.96832 0.68278 Biso 1.000 N
csv文件包含cif的id和属性的对应。
1,1.0
2,2.0
3,3.0
json文件包含原素的随机初始嵌入向量(可以是onehot)。
"1": [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0],
"2": ...
建图算法流程
-
得到所有原子:Structure.from_file(id0.cif):将cif读入,转化为pymatgen.structure
-
得到原子的特征向量(初始嵌入向量)atom_fea: AtomCustomJSONInitializer.get_atom_fea
-
得到原子的邻居all_nbrs: Structure.get_all_neighbors
-
建图 ,得到nbr_id,nbr_fea: 以radius为阈值建边,取最近的max_num_nbr个。不足的对属性向量进行进行正规化(?).最后调用GaussianDistance.expand
总结:根据距离阈值连化学键,再取最邻近的n个,(nbr_fea也可以看出是键的特征)属性中有一些人工提取的距离特征(正规化,高斯距离)。
改进:额外考虑键的3维特征(ALIGNN),额外考虑子图特征(官能团、次级结构)。
CDS cif转 mofs cif
从 Cambridge Structural Database 的原始cif文件经过处理转换,得到qmof数据库文件的流程。目的是去除失真的结构(maximize structural fidelity),涉及化学知识。
流程
1通过ase库规范化CIF文件
from ase.io import read, write
for cif in cifs:
mof = read(os.path.join(cif_path, cif))
write(os.path.join(cif_path, cif), mof)
2通过pymatgen库得到晶体最小的重复单元
structure = Structure.from_file(os.path.join(folder,entry),primitive=True)
3去除非法的cif文件,依据有dist,lone,duplicate,oxo
4 支持xyz文件相互转换
ASE-formatted appended XYZ file to a folder of CIFs.
matDL的建图标准
使用了pytorch geometric 包来实现GNN算法。
读取json格式的qmof数据,转换成如下格式:
├──dictionary_source.json
├──root_dir
├── targets.csv
├── qmof-1234567.json
├── qmof-89abcde.json
├── ...
json的格式为:
{"1": {
"cell": {"array": {"__ndarray__": [[3, 3], "float64", [9.806075328, 0.108025938, 8.4506e-05, -2.412034763, 9.564903313, -3.8425e-05, 0.000113935, -2.188e-05, 13.246085401]]}, "__ase_objtype__": "cell"},
"ctime": 22.202870969564355,
"mtime": 22.202870969564355,
"numbers": {"__ndarray__": [[108], "int32", [27, 27, 27, 27, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8]]},
"pbc": {"__ndarray__": [[3], "bool", [true, true, true]]},
"positions": {"__ndarray__": [[108, 3], "float64", [9.000000002061375e-05, -1.0000000015167157e-05, 6.623059999999954, 3.6971139349999804, 4.836458119999971, 13.246105400999976, ...,]]},
"unique_id": "fc8de825d5b9a6edc082f11ef7e5db52",
"user": null},
"ids": [1],
"nextid": 2}
dataloader
(pyg的dataloader分为处理小规模数据的in memory loader和对应的dataloader。核心是process函数;dictionary_source: 元素的onehot)
Data(edge_index=[2, 507], edge_weight=[507], y=0.6325269937515259,
z=[39], u=[1, 3], structure_id=[1], x=[39, 114], edge_attr=[507, 50])
主要属性
edge_index, edge_weight :稀疏邻接矩阵,直接通过ase_crystal.get_all_distances后矩阵处理得到:
##Obtain distance matrix with ase
distance_matrix = ase_crystal.get_all_distances(mic=True)
##Create sparse graph from distance matrix
distance_matrix_trimmed = threshold_sort(
distance_matrix,
processing_args["graph_max_radius"],
processing_args["graph_max_neighbors"],
adj=False,
)
distance_matrix_trimmed = torch.Tensor(distance_matrix_trimmed)
out = dense_to_sparse(distance_matrix_trimmed)
edge_index = out[0]
edge_weight = out[1]
X:节点嵌入向量,初始值式mofs每个原子的onehot向量堆叠
y label 一维tensor
辅助信息
structure_id : QMOF ID
u placeholder for state feature?[3*n]
z 原子总数
额外的descriptor
edge_vonoroi,SOAP,SM,edge_descriptor
图数据集的属性:length,species(desctiptor 可能用到)
化学计算库介绍
pymatgen
https://pymatgen.org/ for materials analysis。
conda install --channel conda-forge pymatgen
qmof中主要用来读取cif文件并利用其中的Structure类来表示cif,并建图。
核心类
pymatgen.core包提供了分子和晶体结构的数据结构,核心的类包括:
species是元素(形态),
composition是元素及其量的键值对{element:amount}
site是composition及其在空间上的位置, 以及可能的属性(如磁性)。
periodic site 是有lattice system的cite
lattice system 晶格?
molecule和 stucture (有周期), 是site/periodic site 的数组。
属性包括:occupancies, ang, occupancy,length units are in Angstroms and angles are in degrees.
ASE
conda install --channel conda-forge pymatgen 时会一起安装
ASE是一个用Python编程语言编写的原子模拟环境,旨在设置、指导和分析原子模拟。qmof中主要用来读取cif文件。
VASP
VASP是维也纳大学Hafner小组开发的进行电子结构计算和量子力学-分子动力学模拟软件包。它是目前材料模拟和计算物质科学研究中最流行的商用软件之一。用户需要确保版权。之后可以可以用来计算mof结构的性质。
# 导入编译器
module load intel/2017.1
tar xf vasp.5.4.4.tar.gz
cd vasp.5.4.4
cp arch/makefile.include.linux_intel ./makefile.include
make all
# 编译完成后会在vasp.5.4.4的文件夹下的bin文件夹里生成vasp_gam、vasp_ncl、vasp_std三个可自行文件。
# gpu版本安装
module load intel/2017.1
tar xf vasp.5.4.4.tar.gz
cd vasp.5.4.4
cp arch/makefile.include.linux_intel makefile.include
# 修改 -openmp 为 -qopenmp
make gpu
# GPU版本使用的时候需要载入cuda,高版本如2018的intel编译器编译时会报错
VASP:Vasp · Doc (pku.edu.cn) 科学网—VASP 固定POSCAR中部分原子的四类方法 - 郭令举的博文 (sciencenet.cn)
总结
QMOF的gcn和matDL的输入文件相似,只是前者用cif,后者是json,两者都可以用ase库处理。
matDL pyg框架下,用矩阵技巧处理,并增加了很多特性用于扩展到多种GNN算法。 QMOF是pytorch简单实现的gcn。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
2018-03-09 Gym - 101028I March Rain 二分
2018-03-09 Gym - 101020H Weekend floyd+next_permutation
2018-03-09 卿学姐与公主 UESTC - 1324 分块模板题
2018-03-09 CodeForces - 617E XOR and Favorite Number 莫队算法