type
status
date
slug
summary
tags
category
icon
password
Property
Jan 18, 2025 08:34 AM
URL
Notion AI 总结:
本文主要介绍了如何使用 Notion 来管理计算化学数据,解决了传统数据管理方式的几个痛点:
- 手动复制粘贴数据到 Excel 费时费力且容易出错
- 长期积累的数据难以查询和追溯
- 缺乏对计算任务的整体把控
文章提出通过 Notion API 将计算数据自动保存到数据库的解决方案,具有以下优势:
- 自动化数据提取和保存,避免手动操作
- 方便数据查询和备份
- 可导出为 Excel 进行进一步分析
- 结合 Notion AI 实现智能数据检索
文章还详细列出了可提取的数据类型,包括:基本系统信息、原子和分子结构、能量和热力学数据、电子结构和性质、以及光谱和跃迁数据等。
说明:
系统:Ubuntu 22.04
CPU:AMD EPYC 7k62
声明:文章由 ChatGPT+Claude+Notion AI 辅助完成
0. 说明
我们先来看这样的一个场景:
假设我们用 Gaussian 这个计算化学软件来运行某个任务,计算完成后,我们需要对输出文件进行数据的提取,然后保存分析。
问题在于,如果运行了很多任务,那么短时间内你可能还记得数据的含义,但时间一长,你可能就不记得当时做了什么计算、为什么要做这些计算。而且这些数据后期也不好查询。
有些时候我们需要对计算任务有个整体把控,比如知道多少个原子的分子进行什么任务需要多长时间,内存消耗是多少,这样心里才有底。
原则上,我们可以手动复制粘贴到 Excel 进行数据保存和分析,这是个不错的方法。但问题在于手动复制粘贴太麻烦了,一旦任务多起来就很容易出错,也很耗时间。
现在我们有个更好的解决方案:
通过 Notion API 把计算数据自动保存到 Notion 数据库里。这样不仅省去了手动复制粘贴的麻烦,数据的备份和查找也变得特别方便。
比如我们想查之前某个分子的计算结果,或者想看看不同大小的分子计算耗时情况,在Notion里搜索一下就能找到。需要的时候还能直接导出成 Excel ,这样管理计算数据就轻松多了。
现在 Notion AI(需要氪金每个月 5 美元) 集成了 RAG 技术,可以直接问 ai 搜到已经计算的数据,如图
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2F02586f0f-d157-4b55-8f83-8383f5af16a6%2Fimage.png?table=block&id=17f72509-8d05-800a-9fc6-cb14cb879220&t=17f72509-8d05-800a-9fc6-cb14cb879220&width=480&cache=v2)
目前是一个比较粗糙的版本,很多我自己想搞的功能,我都还没放上去,只能一点点开发。
为了方便数据提取,目前是会提取下面的所有的数据
1. 基本系统信息
2. 原子和分子结构
关键词 | 关键词说明 | Data type | 关键词链接 |
aonames | 原子轨道名称 | list of strings | |
atombasis | 每个原子上的原子轨道索引 | list of lists | |
atomcoords | 原子坐标 | array of rank 3 | |
atommasses | 原子质量 | array of rank 1 | |
atomnos | 原子序数 | array of rank 1 | |
coreelectrons | 原子赝势中的核心电子数 | array of rank 1 | |
fonames | 片段轨道名称 | list of strings | |
fragnames | 片段名称 | list of strings | |
frags | 片段中原子的索引 | list of lists | |
gbasis | 高斯基函数的系数和指数 | PyQuante format |
3. 能量和热力学
关键词 | 关键词说明 | Data type | 关键词链接 |
ccenergies | 带耦合簇校正的分子能量 | array of rank 2 | |
dispersionenergies | 色散能量校正 | array of rank 1 | |
enthalpy | 电子和热焓的总和 | float | |
entropy | 熵 | particle*kelvin | |
freeenergy | 电子和热自由能的总和 | float | |
mpenergies | 带Møller-Plesset校正的分子电子能量 | array of rank 2 | |
pressure | 用于热化学的压力 | float | |
scfenergies | SCF(Hartree-Fock, DFT)后的分子电子能量 | array of rank 1 | |
temperature | 用于热化学的温度 | float | |
zpve | 零点振动能校正 | float |
4. 电子结构和性质
关键词 | 关键词说明 | Data type | 关键词链接 |
aooverlaps | 原子轨道重叠矩阵 | array of rank 2 | |
atomcharges | 原子部分电荷 | dict of arrays of rank 1 | |
atomspins | 原子自旋密度 | dict of arrays of rank 1 | |
fooverlaps | 片段轨道重叠矩阵 | array of rank 2 | |
homos | 最高占据分子轨道(HOMO)的索引 | array of rank 1 | |
mocoeffs | 分子轨道系数 | list of arrays of rank 2 | |
moenergies | 分子轨道能量 | list of arrays of rank 1 | |
moments | 分子多极矩 | list of arrays[] | |
mosyms | 轨道对称性 | list of lists | |
nocoeffs | 自然轨道系数 | array of rank 2 | |
nooccnos | 自然轨道占据数 | array of rank 1 | |
nsocoeffs | 自然自旋轨道系数 | list of array of rank 2 | |
nsooccnos | 自然自旋轨道占据数 | list of array of rank 1 |
5. 光谱和跃迁
关键词 | 关键词说明 | Data type | 关键词链接 |
etenergies | 电子跃迁能量 | array of rank 1 | |
etoscs | 电子跃迁的振子强度 | array of rank 1 | |
etdips | 电子跃迁的电跃迁偶极矩 | array of rank 2 | |
etveldips | 电子跃迁的速度规电跃迁偶极矩 | array of rank 2 | |
etmagdips | 电子跃迁的磁跃迁偶极矩 | array of rank 2 | |
etrotats | 电子跃迁的旋转强度 | array of rank 1 | |
etsecs | 电子跃迁的单激发组态 | list of lists | |
etsyms | 电子跃迁的对称性 | list of string | |
nmrtensors | 核磁共振化学屏蔽张量 | dict of dicts of array of rank 2 | |
nmrcouplingtensors | 核磁共振自旋-自旋耦合张量 | dict of dicts of array of rank 2 | |
polarizabilities | (偶极)极化率,静态或动态 | list of arrays of rank 2 | |
transprop | 所有吸收和发射光谱(字典 {名称: etoscs, etenergies}) | etenergies | |
vibanharms | 振动非谐常数 | array of rank 2 | |
vibdisps | 笛卡尔位移矢量 | array of rank 3 | |
vibfreqs | 振动频率 | array of rank 1 | |
vibfconsts | 振动的力常数 | array of rank 1 | |
vibirs | 红外强度 | array of rank 1 | |
vibramans | 拉曼活性 | array of rank 1 | |
vibrmasses | 振动的约化质量 | array of rank 1 | |
vibsyms | 振动的对称性 | list of strings |
6. 优化和动力学
关键词 | 关键词说明 | Data type | 关键词链接 |
geotargets | 几何优化收敛的目标 | array of rank 1 | |
geovalues | 几何优化收敛的当前值 | array of rank 1 | |
grads | 几何优化中力(梯度)的当前值 | array of rank 3 | |
hessian | 力常数矩阵的元素 | array of rank 1 | |
optdone | 标记优化是否已收敛 | Boolean | |
optstatus | 每组原子坐标的优化状态 | array of rank 1 | |
scancoords | 每个扫描步骤的几何构型 | array of rank 3 | |
scanenergies | 势能面的能量 | list | |
scannames | 扫描变量的名称 | list of strings | |
scanparm | 势能面参数的值 | list of tuples | |
scftargets | SCF收敛的目标 | array of rank 2 | |
scfvalues | SCF收敛的当前值 | list of arrays of rank 2 | |
time | 分子动力学和其他轨迹中的时间 | array of rank 1 |
整个项目的文件说明如下,这个是早期版本,后面会修改
文件名 | 描述 |
环境变量部分 | ㅤ |
.env | 包含 Notion API 的 token 和 DataBase 的 id |
cclib 包提取数据部分 | ㅤ |
cclib_data.py | cclib数据处理 |
basic_info.py | 1. 基本信息功能 |
get_electronic_structure_and_properties.py | 2. 获取电子结构和性质 |
get_energies_and_thermodynamics.py | 3. 获取能量和热力学数据 |
get_optimization_and_dynamics.py | 4. 获取优化和动力学数据 |
get_spectra_and_transitions.py | 5. 获取光谱和跃迁数据 |
atom_structure.py | 6. 原子结构相关功能 |
format_calc.py | |
get_data_from_log.py | 从cclib 上面的提取部分获取数据导出为 md 文件 |
发送 Notion 部分 | ㅤ |
notion_begin_status.py | Notion初始状态处理 |
notion_update_status.py | Notion状态更新 |
create_page.py | 创建页面功能 |
add_block.py | 添加块功能 |
add_block_section1.py | 废弃功能 |
数据转换部分 | ㅤ |
md2notion.py | 发送 md 内容到 Notion |
目前实现的效果:
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2F7517c97e-03e9-464f-8c58-9bd80ca3ef10%2FPixPin_2025-01-18_14-31-39.gif?table=block&id=17f72509-8d05-8066-b082-e883d4129e4a&t=17f72509-8d05-8066-b082-e883d4129e4a&width=707.9921875&cache=v2)
1. 准备工作
1.1 Notion API 的获取
到这个网站
新建一个 integrations
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Fdfc7c9c1-7a2f-4bbe-aae1-eaae573fec70%2Fimage.png?table=block&id=17f72509-8d05-8001-8a88-d853b8c23364&t=17f72509-8d05-8001-8a88-d853b8c23364&width=576&cache=v2)
然后
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Fe59fd4dc-de57-4149-817a-80dc70d95e33%2Fimage.png?table=block&id=17f72509-8d05-809f-ac89-d49d559072ac&t=17f72509-8d05-809f-ac89-d49d559072ac&width=576&cache=v2)
配置相关的设置
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Fc675264b-69cc-40e3-9963-02182ae6fbdb%2Fimage.png?table=block&id=17f72509-8d05-800d-acfe-c393a00db7e4&t=17f72509-8d05-800d-acfe-c393a00db7e4&width=576&cache=v2)
然后按照我下面的操作
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2F8872f3de-f36f-4f7c-92cb-6e0d1864501d%2Fimage.png?table=block&id=17f72509-8d05-8064-8c20-e296675023d5&t=17f72509-8d05-8064-8c20-e296675023d5&width=624&cache=v2)
会得到类似于这种 :ntn_3068615*****qYJnVTX0vd18gkUZOCTEvDcuU1KG
保存这个 api token 后面我们要用
1.2 复制数据库 id
打开我这个链接
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2F5afca584-39c1-4e44-9a81-9fa80404c94f%2Fimage.png?table=block&id=17f72509-8d05-8098-bcd3-d912c8e6bb12&t=17f72509-8d05-8098-bcd3-d912c8e6bb12&width=624&cache=v2)
保存数据库后,然后获取database key
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2F7d79f96d-7bbd-4c5f-b233-c1ef6a4f4c67%2Fimage.png?table=block&id=17f72509-8d05-80d8-8619-dcabc49a9a98&t=17f72509-8d05-80d8-8619-dcabc49a9a98&width=624&cache=v2)
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2F4bf15fdc-aba7-437c-84a3-56042a8f2f82%2Fimage.png?table=block&id=17f72509-8d05-80e0-9dbd-ddbecbc5f96c&t=17f72509-8d05-80e0-9dbd-ddbecbc5f96c&width=624&cache=v2)
然后得到下面 database id
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2F35584984-7eab-4951-ad98-25437ad420c3%2Fimage.png?table=block&id=17f72509-8d05-8000-b4c3-e3fc9e6e0978&t=17f72509-8d05-8000-b4c3-e3fc9e6e0978&width=624&cache=v2)
记住这个 database id,后面要用
1.3 数据库链接 api
然后还需要链接我们 1.1 中建立的 integrations
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Ffa3dc0c6-4631-43bb-af72-3af744455611%2Fimage.png?table=block&id=17f72509-8d05-8077-96a5-f8a5a455166d&t=17f72509-8d05-8077-96a5-f8a5a455166d&width=2149&cache=v2)
上面图中 ③ 中的名字是 1.1 步骤中的这个地方名字,下面的 ①
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Fe59fd4dc-de57-4149-817a-80dc70d95e33%2Fimage.png?table=block&id=17f72509-8d05-80b8-a6d3-e49391ca6f19&t=17f72509-8d05-80b8-a6d3-e49391ca6f19&width=576&cache=v2)
1.4 服务器设置
首先确认你的服务器的 Python 版本是 Python 3.7 以上
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Fdb6983ac-203c-4381-a3d1-a0df65c92cf4%2Fimage.png?table=block&id=17f72509-8d05-8059-8f75-f5f921c6ef8f&t=17f72509-8d05-8059-8f75-f5f921c6ef8f&width=624&cache=v2)
安装 cclib Python 包
1.5 SLUM 安装
可以看我这个博客
3. 运行任务
3.1 移动文件到服务器
将这个压缩文件移动到服务器,然后解压,放到服务器的某个文件夹里面,对于我而言,我是放在我的这个下面
/home/wxyhgk/Software/Calc2Notion
然后你需要修改
.env
文件里面内容,如下![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Fba6f3ca3-9b8b-4a56-be2e-13b9ca41e1d7%2Fimage.png?table=block&id=17f72509-8d05-8032-87c3-ff8c0fee9106&t=17f72509-8d05-8032-87c3-ff8c0fee9106&width=384&cache=v2)
NOTION_TOKEN 部分是我们在 1.1 Notion API 的获取 中得到的
NOTION_DATABASE_ID 部分是我们在 1.2 复制数据库 id 中的到的
3.2 任务运行
在一个有 gjf 文件的下面新建一个脚本 calc2notion.sh
#!/bin/bash
# === slurm 配置 ===
# 任务名称
#SBATCH --job-name=g16-2
# 调用一个节点
#SBATCH --nodes=1
# 调用 48 核心
#SBATCH -n 48
# 调用 batch 这个区域的机器
#SBATCH -p batch
# 邮件通知
#SBATCH --mail-user=你的邮箱
# All 代表错误和正确都通知
#SBATCH --mail-type=ALL
# === Gaussian 配置 ===
export g16root=$HOME/Software
export GAUSS_SCRDIR=$g16root/g16/scratch
source $g16root/g16/bsd/g16.profile
export PGI_FASTMATH_CPU=sandybridge
SCRIPT_PATH=" 修改成3.1 步骤中的文件的路径"
# === 变量部分 ===
# slurm jodid 序号
job_id=$SLURM_JOB_ID
# 当前文件夹路径
folder_name="$PWD"
# === 创建 Notion 页面,表示任务开始 ===
page_id=$(python3 "${SCRIPT_PATH}/notion_begin_status.py" "Job-$job_id" "$folder_name")
if [ -z "$page_id" ]; then
echo "创建 Notion 页面失败"
exit 1
fi
# === 封装核心任务 ===
run_g16_and_send_to_notion() {
task_name="$1"
mdFile="${task_name%.gjf}.md"
commands_string="$2"
# 执行命令
eval "$commands_string" # 使用 eval 执行传入的命令串
# 提取 log 文件数据到 .md 文件
python3 "${SCRIPT_PATH}/get_data_from_log.py" "${task_name%.gjf}.log" > ${mdFile}
# 发送 md 文件到 Notion 页面的子页面中
python3 "${SCRIPT_PATH}/md2notion.py" "${mdFile}" ${page_id} --title "${task_name}"
}
# === 第一次任务 ===
run_g16_and_send_to_notion "test1.gjf" "
g16 test1.gjf
formchk test1.chk
cp test1.chk test11.chk
"
# === 第二次任务 ===
run_g16_and_send_to_notion "test2.gjf" "
g16 test2.gjf
"
# 后续复制# === 第二次任务 ===部分即可,但是"test1.gjf" 和 g16 test1.gjf 中的 test1.gjf 必须一致
# === 发送计算完状态给 Notion ===
python3 "${SCRIPT_PATH}/notion_update_status.py" "$page_id" "计算完"
上面的 绿色部分 和 红色部分 是需要你修改的,修改好后,后面用
就行了
4.目前存在的问题以及后续计划
4.1 存在的问题
- 服务器上取消 SLURM 的任务,那么 Notion 这边不会更新
- 目前的输出过于暴力,美观性不太行
- 目前仅仅支持 Gaussian 的计算和数据处理
- 数据库目前展示的内容过少
4.2 后续开发计划
- 利用 Notion webhook 功能,实现可以取消 SLURM 任务的功能
- 优化输出的结果,搭建 html 的前端页面 demo 地址 https://calc.wxyhgk.com/job-2/demo4.html
![notion image](https://www.notion.so/image/https%3A%2F%2Fprod-files-secure.s3.us-west-2.amazonaws.com%2F7d8c4130-89c8-487b-9368-c7dd72a274bf%2Febfd54b4-c0f6-42cd-a21f-8498ba60be86%2Fimage.png?table=block&id=17f72509-8d05-8042-b5bc-d76bc817b093&t=17f72509-8d05-8042-b5bc-d76bc817b093&width=576&cache=v2)
- 增加更多脚本,让计算支持 ORCA/GAMESS-US 等软件
- 增加 ChatGPT 等工具,解析输入文件等
此外为了本地数据保存,后面会考虑使用 思源笔记,可以搭建在自己的服务器上。
- 作者:我心永恒
- 链接:https://wxyhgk.com/article/calc2Notion
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。