计算化学公社

标题: 使用 Mathematica 实现HOMO与LUMO轨道的3D同步可视化及自动排版保存 [打印本页]

作者
Author:
wxyhgk    时间: 2024-2-6 15:08
标题: 使用 Mathematica 实现HOMO与LUMO轨道的3D同步可视化及自动排版保存
本帖最后由 wxyhgk 于 2024-2-6 15:14 编辑

先看效果:


计算数据整理成表格
(, 下载次数 Times of downloads: 62)


优点:


测试平台:






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 模板,然后将这些图片直接拖入,免去每次都需要排班的麻烦

(, 下载次数 Times of downloads: 65)

2.1 表格函数
https://www.123pan.com/s/U8JrVv-9Q6EH.html
(, 下载次数 Times of downloads: 65)

使用方法:
step1:在电脑文件夹下面建立一个文件夹
setp2:将 Mathematica 的 nb 文件,所需的 log 文件,homo,lumo 的 cube 文件放入上面建立的文件夹当中
setp3:运行代码即可,然后运行代码,调整好视角后会自动保存在你这个文件夹里面
(, 下载次数 Times of downloads: 64)

2.2 同步可视化排版函数
  1. Clear["Global`*"]
  2. (*设置nb文件所在的位置*)
  3. SetDirectory[NotebookDirectory[]];
  4. (*log文件*)
  5. s0Log = "s0.log";

  6. (*cube 文件*)
  7. s0HomoCube = "s0_homo.cube";
  8. s0LumoCUbe = "s0_lumo.cube";
  9. s1HomoCube = "s1_homo.cube";
  10. s1LumoCube = "s1_lumo.cube";

  11. (*输出图片*)
  12. s0HomoPic = "s0_homo.png";
  13. s0LumoPic = "s0_LumoPic.png";
  14. s1HomoPic = "s1_HomoPic.png";
  15. s1LumoPic = "s1_LumoPic.png";

  16. DynamicModule[{vp = {1.3, -2.4, 2.0}, vv = {0, 0, 1}},
  17. logFun[file_] :=
  18.   Import["s0.log", "GaussianLog"] //
  19.    MoleculePlot3D[#, ViewPoint -> Dynamic[vp],
  20.      ViewVertical -> Dynamic[vv], SphericalRegion -> True] &;
  21. cubeFun[file_] :=
  22.   Import[file, "Graphics3D", ContourStyle -> {Red, Blue},
  23.    ViewPoint -> Dynamic[vp], ViewVertical -> Dynamic[vv],
  24.    SphericalRegion -> True];

  25. (*=== 定义分子模型图 ===*)
  26. s03D = logFun[s0Log];
  27. s0Homo = cubeFun[s0HomoCube];
  28. s0Lumo = cubeFun[s0LumoCUbe];
  29. s1Homo = cubeFun[s1HomoCube];
  30. s1Lumo = cubeFun[s1LumoCube];

  31. (*=== 创建组合图形布局 ===*)
  32. (*定义一个应用样式的函数*)
  33. styledText1[text_] :=
  34.   Style[text, FontFamily -> "Times New Roman", FontSize -> 18];
  35. styledText2[text_] :=
  36.   Style[text, FontFamily -> "Times New Roman", FontSize -> 12];
  37. (*应用样式到具体文本*)

  38. s0Text = styledText1["s0"];
  39. s1Text = styledText1["s1"];
  40. homoText = styledText2["HOMO"];
  41. lumoText = styledText2["LUMO"];

  42. (* ===构建 combinedGraphics ===*)
  43. combinedGraphics = Grid[
  44.    {{s03D, s0Homo, s0Text, s0Lumo, s1Homo, s1Text, s1Lumo},
  45.     {" ", homoText, " ", lumoText, homoText, " ", lumoText}},
  46.    Alignment -> Center, Spacings -> {1, 0.3},
  47.    Dividers -> {{{False, True, False, False, True, False, False},
  48.       False}}, FrameStyle -> Directive[Dashed]];

  49. (*=== 动态面板 ===*)
  50. Panel@Column[{
  51.     Dynamic@combinedGraphics,
  52.     Button["Save",
  53.      Export[s0HomoPic, s0Homo, Background -> None];
  54.      Export[s0LumoPic, s0Lumo, Background -> None];
  55.      Export[s1HomoPic, s1Homo, Background -> None];
  56.      Export[s1LumoPic, s1Lumo, Background -> None];
  57.      Export["s0s1_homolumo.png", combinedGraphics, "PNG",
  58.       Background -> None];
  59.      Method -> "Queued"]}]]
复制代码
(, 下载次数 Times of downloads: 64)
使用方法和步骤 2.1 中的相同

当然很多论文中有那种 HOMO 在下面, LUMO 在上面的那种能级图,通过修改我上面的代码,也可以实现这一点,省去手动排班的麻烦,此外 Gap 还能直接通过计算相应的文件得到,无需自己手动排版,用 excel 计算等各种麻烦的操作。
(, 下载次数 Times of downloads: 59)



3. 其他
使用 Mathematica 还有一个好处就是,无需每次都重新打开重新载入,因为一旦运行成功后,以后每次打开都能自己随意调整视角什么的,同时还能做其他的数据分析,偶极矩,发光光色,弗朗克-康登原理,分子静电式的可视化和排版等等

(, 下载次数 Times of downloads: 60)


  1. (* === 1. 定义文件路径 === *)
  2. path1 = "http://pic.wxyh.top/C3H4O2-esp.cube"; (*导入esp.cube文件的路径*)
  3. path2 = "http://pic.wxyh.top/C3H4O2-Potential.cube"; (*导入Potential.cube文件的路径*)

  4. (* === 2. 导入体积数据 === *)
  5. espCube = Import[path1, "VolumetricData"]; (*导入esp.cube文件*)
  6. potentialCube = Import[path2, "VolumetricData"]; (*导入Potential.cube文件*)

  7. (* === 3. 获取数据信息 === *)
  8. espData = espCube["Data"]; (*从esp.cube文件中提取数据*)
  9. potentialData = potentialCube["Data"]; (*从Potential.cube文件中提取数据*)
  10. dataRange = espCube["DataRange"]; (*获取数据的范围*)

  11. (* === 4. 处理数据 === *)
  12. espDataNormal = Normal[espData]; (*将espData数据标准化*)
  13. potentialDataNormal = Normal[potentialData]; (*将potentialData数据标准化*)

  14. (* === 5. 绘图 === *)
  15. mole = Import[path1, "Molecule"]; (*导入分子数据*)

  16. moleplot = MoleculePlot3D@mole; (*生成分子模型*)
  17. surface = ListContourPlot3D[espData[[1]], Contours -> 0.03 {-1, 1}, DataRange -> dataRange] // DiscretizeGraphics; (*生成等值面*)

  18. potentialPlot = ListSliceDensityPlot3D[potentialData[[1]], surface, DataRange -> dataRange,
  19.   ColorFunction -> ({Opacity[0.8], Blend["M10DefaultDensityGradient", #1]} &), PlotLegends -> Automatic]; (*生成静电势图*)

  20. Show[moleplot, potentialPlot] (*显示分子模型和静电势图*)
复制代码
(, 下载次数 Times of downloads: 61)











作者
Author:
abin    时间: 2024-2-7 18:42
我认为
Mathematica
应该列为,理工科,尤其是工科学生的必修课或者选修课,
而不是追求高数中的解题技巧。
作者
Author:
shuiningzhu    时间: 2024-2-23 09:36
接触了十年的Mathematic,总以为用处不大,今天终于有用了




欢迎光临 计算化学公社 (http://bbs.keinsci.com/) Powered by Discuz! X3.3