|
本帖最后由 wxyhgk 于 2025-1-18 16:57 编辑
说明:
系统:Ubuntu 22.04
CPU:AMD EPYC 7k62
声明:文章由 ChatGPT+Claude+Notion AI 辅助完成
0. 说明
我们先来看这样的一个场景:
假设我们用 Gaussian 这个计算化学软件来运行某个任务,计算完成后,我们需要对输出文件进行数据的提取,然后保存分析。
问题在于,如果运行了很多任务,那么短时间内你可能还记得数据的含义,但时间一长,你可能就不记得当时做了什么计算、为什么要做这些计算。而且这些数据后期也不好查询。
有些时候我们需要对计算任务有个整体把控,比如知道多少个原子的分子进行什么任务需要多长时间,内存消耗是多少,这样心里才有底。
原则上,我们可以手动复制粘贴到 Excel 进行数据保存和分析,这是个不错的方法。但问题在于手动复制粘贴太麻烦了,一旦任务多起来就很容易出错,也很耗时间。
现在我们有个更好的解决方案:
通过 Notion API 把计算数据自动保存到 Notion 数据库里。这样不仅省去了手动复制粘贴的麻烦,数据的备份和查找也变得特别方便。
比如我们想查之前某个分子的计算结果,或者想看看不同大小的分子计算耗时情况,在Notion里搜索一下就能找到。需要的时候还能直接导出成 Excel ,这样管理计算数据就轻松多了。
现在 Notion AI(需要氪金每个月 5 美元) 集成了 RAG 技术,可以直接问 ai 搜到已经计算的数据,如图
目前是一个比较粗糙的版本,很多我自己想搞的功能,我都还没放上去,只能一点点开发。
为了方便数据提取,目前是会提取下面的所有的数据
整个项目的文件说明如下,这个是早期版本,后面会修改
文件名 | 描述 | |
| .env | 包含 Notion API 的 token 和 DataBase 的 id | |
| cclib_data.py | | | | get_electronic_structure_and_properties.py | | get_energies_and_thermodynamics.py | | get_optimization_and_dynamics.py | | get_spectra_and_transitions.py | | | | | | | 从cclib 上面的提取部分获取数据导出为 md 文件 | |
| notion_begin_status.py | | | | | | | | | | |
| md2notion.py | |
目前实现的效果:
数据库会保存当前计算状态、计算文件夹位置、计算开始日期,以及每个计算任务及其子任务的开始时间和数据提取结果
1. 准备工作
1.1 Notion API 的获取
到这个网站
https://www.notion.so/profile/integrations
新建一个 integrations
然后
配置相关的设置
然后按照我下面的操作
会得到类似于这种 :ntn_3068615*****qYJnVTX0vd18gkUZOCTEvDcuU1KG
保存这个 api token 后面我们要用
1.2 复制数据库 id
打开我这个链接
https://www.notion.so/Notion-API ... fa4e7ba168be?pvs=21
保存数据库后,然后获取database key
然后得到下面 database id
记住这个 database id,后面要用
1.3 数据库链接 api
然后还需要链接我们 1.1 中建立的 integrations
上面图中 ③ 中的名字是 1.1 步骤中的这个地方名字,下面的 ①
1.4 服务器设置
首先确认你的服务器的 Python 版本是 Python 3.7 以上
安装 cclib Python 包
1.5 SLUM 安装
可以看我这个博客
https://wxyhgk.com/article/ubuntu-slurm
3. 运行任务
3.1 移动文件到服务器
文件下载
https://pan.wxyhgk.com/d/local/tmp/Calc2Noiton.7z
Calc2Noiton.7z
(8.47 KB, 下载次数 Times of downloads: 6)
将这个压缩文件移动到服务器,然后解压,放到服务器的某个文件夹里面,对于我而言,我是放在我的这个下面
`/home/wxyhgk/Software/Calc2Notion`
然后你需要修改 `.env` 文件里面内容,如下
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
- - 增加更多脚本,让计算支持 ORCA/GAMESS-US 等软件
- - 增加 ChatGPT 等工具,解析输入文件等
此外为了本地数据保存,后面会考虑使用 思源笔记,可以搭建在自己的服务器上。
可达到我博客看 https://wxyhgk.com/article/calc2Notion 排版更好
|
评分 Rate
-
查看全部评分 View all ratings
|