本帖最后由 wxyhgk 于 2024-2-6 15:14 编辑
先看效果:
优点:
- 分子同步转动,省去手动调节每个分子
- 排版一键完成,并且保存高清图片
- ppt 演讲的时候如果条件允许可以直接用 Mathematica 笔记本将更加清晰
测试平台:
- 系统:Ubuntu20.04 / win11 / MacOS 13.4
- CPU:AMD 5950x/i7-13700/苹果 M1
- Mathematica 13.3/Mathematica 14.0
1. 需求 在化学反应研究中,最高占据分子轨道(HOMO)和最低未占据分子轨道(LUMO)的理解和分析至关重要。传统上,我们依赖 Gaussian09/16 软件来计算这些轨道数据,这一过程涉及将计算结果的 chk 文件通过 formchk 命令转换为 fchk 文件,再使用 cubegen 命令将 fchk 文件转化为 cube 文件,最后进行可视化处理。
然而,这一流程并不尽如人意,尤其是在需要同时处理多个分子的轨道数据时。每当需要统一调整多个分子的视角以保持一致性时,工作量急剧增加,手动调整变得异常繁琐。此外,完成这些步骤后,我们还需进行复杂的图像排版工作,这在处理大量分子时更是耗时耗
最近我在北京实习,用的服务器是某大学的集群,不能上网,Python 包安装起来也费劲,开始写的 Python 脚本,后来写的 shell 脚本,发现效果都让我不太舒服,因为最后都需要放到 ppt 里面,所以我索性,直接使用 Wolfram 语言解决,把排版也搞好,然后就能直接用了。
2. 解决 面对这些繁琐且耗时的步骤,我想到了一个高效且简洁的解决方案:结合 Mathematica 和 Gaussian 16,实现一键式分子轨道可视化和自动排版。
首先,我们继续利用 Gaussian 16 进行精确的轨道数据计算。接着,借助 Mathematica 强大的数据处理和图形展示能力,将这些复杂的数据转换成直观的3D图像。这一过程不仅简化了数据转换,还提高了整体的工作效率
接着我们在 PowerPoint 里面做好 ppt 模板,然后将这些图片直接拖入,免去每次都需要排班的麻烦
2.1 表格函数
https://www.123pan.com/s/U8JrVv-9Q6EH.html
使用方法:
step1:在电脑文件夹下面建立一个文件夹
setp2:将 Mathematica 的 nb 文件,所需的 log 文件,homo,lumo 的 cube 文件放入上面建立的文件夹当中
setp3:运行代码即可,然后运行代码,调整好视角后会自动保存在你这个文件夹里面
2.2 同步可视化排版函数
- Clear["Global`*"]
- (*设置nb文件所在的位置*)
- SetDirectory[NotebookDirectory[]];
- (*log文件*)
- s0Log = "s0.log";
- (*cube 文件*)
- s0HomoCube = "s0_homo.cube";
- s0LumoCUbe = "s0_lumo.cube";
- s1HomoCube = "s1_homo.cube";
- s1LumoCube = "s1_lumo.cube";
- (*输出图片*)
- s0HomoPic = "s0_homo.png";
- s0LumoPic = "s0_LumoPic.png";
- s1HomoPic = "s1_HomoPic.png";
- s1LumoPic = "s1_LumoPic.png";
- DynamicModule[{vp = {1.3, -2.4, 2.0}, vv = {0, 0, 1}},
- logFun[file_] :=
- Import["s0.log", "GaussianLog"] //
- MoleculePlot3D[#, ViewPoint -> Dynamic[vp],
- ViewVertical -> Dynamic[vv], SphericalRegion -> True] &;
- cubeFun[file_] :=
- Import[file, "Graphics3D", ContourStyle -> {Red, Blue},
- ViewPoint -> Dynamic[vp], ViewVertical -> Dynamic[vv],
- SphericalRegion -> True];
-
- (*=== 定义分子模型图 ===*)
- s03D = logFun[s0Log];
- s0Homo = cubeFun[s0HomoCube];
- s0Lumo = cubeFun[s0LumoCUbe];
- s1Homo = cubeFun[s1HomoCube];
- s1Lumo = cubeFun[s1LumoCube];
-
- (*=== 创建组合图形布局 ===*)
- (*定义一个应用样式的函数*)
- styledText1[text_] :=
- Style[text, FontFamily -> "Times New Roman", FontSize -> 18];
- styledText2[text_] :=
- Style[text, FontFamily -> "Times New Roman", FontSize -> 12];
- (*应用样式到具体文本*)
-
- s0Text = styledText1["s0"];
- s1Text = styledText1["s1"];
- homoText = styledText2["HOMO"];
- lumoText = styledText2["LUMO"];
-
- (* ===构建 combinedGraphics ===*)
- combinedGraphics = Grid[
- {{s03D, s0Homo, s0Text, s0Lumo, s1Homo, s1Text, s1Lumo},
- {" ", homoText, " ", lumoText, homoText, " ", lumoText}},
- Alignment -> Center, Spacings -> {1, 0.3},
- Dividers -> {{{False, True, False, False, True, False, False},
- False}}, FrameStyle -> Directive[Dashed]];
-
- (*=== 动态面板 ===*)
- Panel@Column[{
- Dynamic@combinedGraphics,
- Button["Save",
- Export[s0HomoPic, s0Homo, Background -> None];
- Export[s0LumoPic, s0Lumo, Background -> None];
- Export[s1HomoPic, s1Homo, Background -> None];
- Export[s1LumoPic, s1Lumo, Background -> None];
- Export["s0s1_homolumo.png", combinedGraphics, "PNG",
- Background -> None];
- Method -> "Queued"]}]]
复制代码
使用方法和步骤 2.1 中的相同
当然很多论文中有那种 HOMO 在下面, LUMO 在上面的那种能级图,通过修改我上面的代码,也可以实现这一点,省去手动排班的麻烦,此外 Gap 还能直接通过计算相应的文件得到,无需自己手动排版,用 excel 计算等各种麻烦的操作。
3. 其他
使用 Mathematica 还有一个好处就是,无需每次都重新打开重新载入,因为一旦运行成功后,以后每次打开都能自己随意调整视角什么的,同时还能做其他的数据分析,偶极矩,发光光色,弗朗克-康登原理,分子静电式的可视化和排版等等
- (* === 1. 定义文件路径 === *)
- path1 = "http://pic.wxyh.top/C3H4O2-esp.cube"; (*导入esp.cube文件的路径*)
- path2 = "http://pic.wxyh.top/C3H4O2-Potential.cube"; (*导入Potential.cube文件的路径*)
- (* === 2. 导入体积数据 === *)
- espCube = Import[path1, "VolumetricData"]; (*导入esp.cube文件*)
- potentialCube = Import[path2, "VolumetricData"]; (*导入Potential.cube文件*)
- (* === 3. 获取数据信息 === *)
- espData = espCube["Data"]; (*从esp.cube文件中提取数据*)
- potentialData = potentialCube["Data"]; (*从Potential.cube文件中提取数据*)
- dataRange = espCube["DataRange"]; (*获取数据的范围*)
- (* === 4. 处理数据 === *)
- espDataNormal = Normal[espData]; (*将espData数据标准化*)
- potentialDataNormal = Normal[potentialData]; (*将potentialData数据标准化*)
- (* === 5. 绘图 === *)
- mole = Import[path1, "Molecule"]; (*导入分子数据*)
- moleplot = MoleculePlot3D@mole; (*生成分子模型*)
- surface = ListContourPlot3D[espData[[1]], Contours -> 0.03 {-1, 1}, DataRange -> dataRange] // DiscretizeGraphics; (*生成等值面*)
- potentialPlot = ListSliceDensityPlot3D[potentialData[[1]], surface, DataRange -> dataRange,
- ColorFunction -> ({Opacity[0.8], Blend["M10DefaultDensityGradient", #1]} &), PlotLegends -> Automatic]; (*生成静电势图*)
- Show[moleplot, potentialPlot] (*显示分子模型和静电势图*)
复制代码
|