Skip to content
python
import sys;sys.path.append('d:/code/pywfn')

实用工具

定义了一些基于文件读取和分子基类的功能类,功能比较杂,可能会经常改变

所有的相关模块都定义在pywfn.tools子包下

gjf

包含了对gjf文件进行快速处理的函数

拼接多个gjf文件

这个没啥技术难度,就是将多个gjf拼接在一起,只不过写出来方便cli中快速使用

示例代码

下面代码将两个相同的gjf文件拼接在一起,并返回拼接后的文本

python
from pywfn.tools.gjf import Tool as GjfTool

paths=[
    './mols/C6H6.gjf',
    './mols/erxi.gjf'
]

tool=GjfTool()
text=tool.join(paths)
print(text)
%chk=D:\gfile\pywfn\C6H6.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C                  0.00000000    1.40140000    0.00000000
 C                  1.21364800    0.70070000    0.00000000
 C                  1.21364800   -0.70070000    0.00000000
 C                  0.00000000   -1.40140000    0.00000000
 C                 -1.21364800   -0.70070000    0.00000000
 C                 -1.21364800    0.70070000    0.00000000
 H                  0.00000000    2.47140000    0.00000000
 H                  2.14029500    1.23570000    0.00000000
 H                  2.14029500   -1.23570000    0.00000000
 H                  0.00000000   -2.47140000    0.00000000
 H                 -2.14029500   -1.23570000    0.00000000
 H                 -2.14029500    1.23570000    0.00000000

--Link1--

%chk=D:\code\pywfn\tutori\mols\erxi.chk
# hf/3-21g

Title Card Required

0 1
 C                 -0.44158654    0.63079420    0.00000000
 H                 -1.50752482    0.53765131    0.00000000
 C                  0.44158654   -0.63079420    0.00000000
 H                  1.50752482   -0.53765131    0.00000000
 C                 -0.13127679   -1.85896139    0.00000000
 H                 -1.19721507   -1.95210428    0.00000000
 H                  0.48235645   -2.73551957    0.00000000
 C                  0.13127679    1.85896139    0.00000000
 H                 -0.48235645    2.73551957    0.00000000
 H                  1.19721507    1.95210428    0.00000000

环心添加Bq原子

为了方便计算NICS值,可以在gjf在环心自动添加Bq原子

示例代码

下列代码在苯环中心添加了Bq原子,并获取到了修改后的gjf文本

python
from pywfn.tools.gjf import Tool as GjfTool
from pathlib import Path
path='./mols/C6H6.gjf'
print(Path(path).read_text()) # 原始的gjf文件内容
tool=GjfTool()
rings=[
    [1,2,3,4,5,6]
]
print('-'*50)
text=tool.ringBq(path,rings)
print(text) #修改后的gjf文件内容
%chk=D:\gfile\pywfn\C6H6.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C                  0.00000000    1.40140000    0.00000000
 C                  1.21364800    0.70070000    0.00000000
 C                  1.21364800   -0.70070000    0.00000000
 C                  0.00000000   -1.40140000    0.00000000
 C                 -1.21364800   -0.70070000    0.00000000
 C                 -1.21364800    0.70070000    0.00000000
 H                  0.00000000    2.47140000    0.00000000
 H                  2.14029500    1.23570000    0.00000000
 H                  2.14029500   -1.23570000    0.00000000
 H                  0.00000000   -2.47140000    0.00000000
 H                 -2.14029500   -1.23570000    0.00000000
 H                 -2.14029500    1.23570000    0.00000000


--------------------------------------------------
%chk=C6H6_Bq.chk.chk
# b3lyp/6-31g(d) NMR

Title Card Required

0 1
 C    0.00000000    1.40086102    0.00000000
 C    1.21318114    0.70043051    0.00000000
 C    1.21318114   -0.70043051    0.00000000
 C    0.00000000   -1.40086102    0.00000000
 C   -1.21318114   -0.70043051    0.00000000
 C   -1.21318114    0.70043051    0.00000000
 H    0.00000000    2.47044945    0.00000000
 H    2.13947177    1.23522472    0.00000000
 H    2.13947177   -1.23522472    0.00000000
 H    0.00000000   -2.47044945    0.00000000
 H   -2.13947177   -1.23522472    0.00000000
 H   -2.13947177    1.23522472    0.00000000
Bq    0.00000000    0.00000002    0.00000000

刚性旋转扫描gjf

将gjf内的分子的一个键进行旋转扫描,生成多个结构拼接成一个gjf并返回文本

示例代码

下面代码将1,3-丁二烯按中间的键旋转10步,每步36°

python
from pywfn.tools.gjf import Tool as GjfTool
import numpy as np

tool=GjfTool()
path='./mols/erxi.gjf'
text=tool.scan_bond(path,1,3,10,np.pi*2/10)
print(text)
%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -1.50694501    0.53744453    0.00000000
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C    0.13122629    1.85824633    0.00000000
 H   -0.48217094    2.73446751    0.00000000
 H    1.19675469    1.95135355    0.00000000


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -1.36202145    0.63889802    0.54446000
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -0.05232550    1.72975123   -0.68958151
 H   -0.66572273    2.60597229   -0.68958157
 H    0.86827922    1.72140479   -1.23404169


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -0.51362413    1.23281729    0.88095486
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -1.12685633    0.97752738   -1.11576641
 H   -1.74025357    1.85374832   -1.11576641
 H   -1.05464911    0.37526166   -1.99672139


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -0.13420928    1.49842620   -0.54446000
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -1.60740125    0.64112264    0.68958151
 H   -2.22079849    1.51734340    0.68958157
 H   -1.91460872   -0.22675191    1.23404157


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -1.50694501    0.53744447    0.00000000
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C    0.13122635    1.85824621    0.00000000
 H   -0.48217058    2.73446679    0.00000002
 H    1.19675457    1.95135331    0.00000003


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H    0.01071443    1.59987962   -0.00000000
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -1.79095292    0.51262730   -0.00000000
 H   -2.40434980    1.38884771   -0.00000002
 H   -2.24308419   -0.45670062   -0.00000003


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -1.36202133    0.63889784    0.54446006
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -0.05232529    1.72975099   -0.68958151
 H   -0.66572207    2.60597134   -0.68958151
 H    0.86827928    1.72140467   -1.23404157


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -0.98260641    0.90450662   -0.88095492
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -0.53287017    1.39334607    1.11576641
 H   -1.14626682    2.26956630    1.11576629
 H    0.00831946    1.11939108    1.99672115


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H   -0.13420908    1.49842584   -0.54446006
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -1.60740113    0.64112222    0.68958145
 H   -2.22079778    1.51734245    0.68958139
 H   -1.91460860   -0.22675197    1.23404145


--Link1--

%chk=chk.chk
# b3lyp/6-31g(d) pop=full gfinput iop(3/33=1)

Title Card Required

0 1
 C   -0.44141671    0.63055158    0.00000000
 H    0.01071448    1.59987950   -0.00000005
 C    0.44141671   -0.63055158    0.00000000
 H    1.50694501   -0.53744453    0.00000000
 C   -0.13122630   -1.85824633    0.00000000
 H   -1.19675469   -1.95135355    0.00000000
 H    0.48217094   -2.73446751    0.00000000
 C   -1.79095280    0.51262712   -0.00000012
 H   -2.40434957    1.38884723   -0.00000015
 H   -2.24308372   -0.45670056   -0.00000007

log工具

与log文件相关的各种工具函数

提取SI信息

从log文件中提取分子结构、振动频率及各种能量,可以导出成单独的txt文件

示例代码

python
from pywfn.tools.log import Tool as LogTool

tool=LogTool()
paths=[
    './mols/CH4_freq.out'
]
text=tool.get_si(paths)
print(text)
CH4_freq.out

Zero-point correction                             0.04895000
Thermal correction to Energy                      0.05180100
Thermal correction to Enthalpy                    0.05274500
Thermal correction to Gibbs Free Energy           0.03169000
Sum of electronic and zero-point Energies       -39.92745600
Sum of electronic and thermal Energies          -39.92460500
Sum of electronic and thermal Enthalpies        -39.92366100
Sum of electronic and thermal Free Energies     -39.94471600

Cartesian coordinate
C                 0.00000000      0.00000000      0.00000000
H                 0.61776500      0.61776500      0.61776500
H                -0.61776500     -0.61776500      0.61776500
H                -0.61776500      0.61776500     -0.61776500
H                 0.61776500     -0.61776500     -0.61776500

Variable frequencies
             1497.86             1497.86             1497.86
             1733.03             1733.03             3303.23
             3407.88             3407.88             3407.88

分割结构优化

将结构优化文件的各个步骤单独到处成独立的分子对象

示例代码

以下代码将结构优化过程中的每个结构提取出来并绘制能量变化曲线

python
from pywfn.tools.log import Tool as LogTool
import matplotlib.pyplot as plt

tool=LogTool()
mols=tool.split_scan('./mols/C6H6_opt.out')
print(mols)
engs=[mol.energy for mol in mols]
print(engs)
[<C6H6,12>, <C6H6,12>, <C6H6,12>, <C6H6,12>]
[-232.233302107, -232.248327036, -232.248642938, -232.248649641]

分割link任务

将由link拼接的包含多个任务的log文件分割成单独的log文件

一般这种文件比较大,因此直接在log文件所在的目录创建“文件名_lsp”的文件夹,将分割开来的log文件都存储其中

示例代码

python
from pywfn.tools.log import Tool as LogTool

tool=LogTool()
tool.split_link('./mols/link.out')
save mols\link_lsp/0.log complete
save mols\link_lsp/1.log complete
导出完成 >_<

xml

对chemdraw文件处理的相关函数

ChemDraw分子绘制

将chendraw文件中的分子按照点和线绘制出来

示例代码

python
from pywfn.tools import xml

path='mols/C6H6.cdxml'
tool=xml.Tool(path)
tool.show()

png

ChemDraw分子染色

可以指定节点编号为边上颜色

示例代码

下面代码将苯环中的一条边变为红色

python
from pywfn.tools import xml

path='mols/C6H6.cdxml'
tool=xml.Tool(path)
tool.set_color((2,4),(1.,0.,0.))
tool.save('mols/C6H6_color.cdxml')