• 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.

    title

    (以下都是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": ...
    

    建图算法流程

    1. 得到所有原子:Structure.from_file(id0.cif):将cif读入,转化为pymatgen.structure

    2. 得到原子的特征向量(初始嵌入向量)atom_fea: AtomCustomJSONInitializer.get_atom_fea

    3. 得到原子的邻居all_nbrs: Structure.get_all_neighbors

    4. 建图 ,得到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。

  • 相关阅读:
    IntelliJ IDEA 14.x 快捷键/个性化设置
    Memcache的mutex设计模式 -- 高并发解决方案
    导出/导入Eclipse的workspace配置(备份Eclipse配置)
    URL、URN、URI的区别?
    Thinkpad E440个性化设置:如何/禁用关闭触摸板?
    PHP 正则表达式匹配函数 preg_match 与 preg_match_all
    PHP合并2个数字键数组的值
    编译安装 Zend Opcache 缓存Opcache,加速 PHP
    Linux 新建用户、用户组,给用户分配权限(chown、useradd、groupadd、userdel、usermod、passwd、groupdel)
    alter table锁表,MySQL出现Waiting for table metadata lock的场景浅析及解决方案
  • 原文地址:https://www.cnblogs.com/SuuT/p/15984713.html
Copyright © 2020-2023  润新知