计算化学公社

标题: 使用Multiwfn一键批量产生各类光谱图 [打印本页]

作者
Author:
sobereva    时间: 2019-4-29 14:35
标题: 使用Multiwfn一键批量产生各类光谱图
本文配有操作演示视频,强烈建议一看https://www.bilibili.com/video/av50818216

使用Multiwfn一键批量产生各类光谱图
Using Multiwfn to batch generate various spectra with one click

文/Sobereva@北京科音  2019-Apr-29


0 前言

如果读者还没看过《使用Multiwfn绘制红外、拉曼、UV-Vis、ECD、VCD和ROA光谱图》(http://sobereva.com/224)请先看此文。波函数分析程序Multiwfn具有非常强大的光谱绘制功能,本文目的是介绍一个小技巧,使用批处理文件,仅通过一条命令就令Multiwfn把当前目录下所有输入文件转化为光谱图。这里说的输入文件是指Multiwfn绘制光谱图的功能支持的输入文件,比如Gaussian、ORCA等程序的电子激发计算、振动分析任务的输出文件等,详见上面提到的文章。

Multiwfn可在主页http://sobereva.com/multiwfn免费下载,读者务必使用2019-Apr-28及之后更新的程序包,否则没有本文中提到的文件。

在程序包的examples\spectra\indigo目录下有四个.out文件,都是Gaussian使用不同级别做电子激发计算的输出文件,我们以这四个文件为例,说明怎么一下子就把它们都转化成UV-Vis光谱图像文件。


1 在Windows下运行

这里首先假设读者用的是Windows版。将四个.out文件都拷到Multiwfn目录下,然后把examples\spectra目录下的UV-Vis.txt和batchspec.bat也拷到Multiwfn目录下。然后把Multiwfn目录下的settings.ini里的isilent设为1并保存文件。直接双击batchspec.bat,马上当前目录下就出现了四个与输入文件同名的png文件,是UV-Vis谱的图像文件,可见极其方便!

原理是什么?首先看batchspec.bat,这是一个Windows下的批处理文件,点击右键选编辑,就可以看到以下内容
for /f %%i in ('dir *.out /b') do (
Multiwfn %%i < UV-Vis.txt > NUL
rename DISLIN.png %%~ni.png
)

其中dir *.out显示当前目录下所有.out文件,利用for循环将每个文件名依次赋值给%%i,并对每个文件调用当前目录下的Multiwfn程序按照UV-Vis.txt文件里记录的指令进行处理。由于输出在屏幕上的信息不是我们需要的,所以将这些信息重定向到NUL,它相当于是个垃圾桶,定向到里面的信息都会消失不见。Multiwfn每次处理完一个文件后,会在当前目录下产生DISLIN.png文件,为了让文件名与输入文件相同,因此用rename重命名一下,%%~ni的写法代表把%%i变量记录的文件名的后缀去除。

再来看记录了在Multiwfn里输入的指令的UV-Vis.txt文件,内容如下,每一行对应在Multiwfn里敲入的一次指令,//后面是注释。如果还有不理解的,启动Multiwfn载入任意一个out文件,照着里面的命令敲一遍就肯定懂了
11  //光谱绘制功能
3  //绘制UV-Vis
0  //显示一次光谱,否则之后无法修改纵坐标
3  //修改横坐标设定
150,850,100  //初值,终值,步长
4  //修改左侧坐标轴(对应摩尔吸收系数)
0,45000,5000  //初值,终值,步长
y  //对右侧纵坐标做相应的缩放/平移
5  //修改右侧坐标轴(对应振子强度)
0,1.0,0.1  //初值,终值,步长
n  //不对左侧坐标轴做相应的缩放/平移
1  //产生图像文件

由于在选择选项0的时候光谱会在屏幕上弹出来,因此要把settings.ini里的isilent设为1使程序处于安静模式,这样就不会蹦出图像,免得到时候还得手动关闭了。

可见批量调用Multiwfn绘制光谱的机理非常简单易懂,想改什么,只要改相应内容就行了。一般需要改的就是坐标轴范围,可以先跑一下,发现范围不合理的话,改一下UV-Vis.txt里的坐标轴设置然后重新跑即可。

在examples\spectra目录下还有个IR.txt。如果你把此文件拷到Multiwfn目录,把batchspec.bat里的UV-Vis.txt改为IR.txt,那么双击batchspec.bat时就会把当前目录下所有.out文件转化为红外光谱的图像文件。IR.txt的内容就不再解释了,因为只要照着IR.txt里的指令在Multiwfn里敲一遍,对照屏幕上的提示,马上就能理解其中的内容。

想用Multiwfn批量绘制其它类型的光谱,如ROA、Raman、VCD、ECD、光电子谱,只要自己创建个记录了绘制命令的.txt文件,按照上述过程使用它来批处理即可。


2 在Linux下运行

如果你用的是Linux版Multiwfn,也想这样通过批处理绘图的话,先按照Multiwfn手册2.1.2节的步骤以正规方式安装Multiwfn,把examples\spectra中的batchspec.sh、UV-Vis.txt以及要绘图的文件都拷到当前目录下,然后在终端里输入./batchspec.sh运行之即可。如果提示没有可执行权限,先运行一下chmod +x ./batchspec.sh。

batchspec.sh是个Bash shell的脚本,内容为:
#!/bin/bash
for inf in *.out
do
Multiwfn ${inf} < UV-Vis.txt > /dev/null
mv -f dislin.png ${inf//out/png}
done

可见和batchspec.bat的内容大同小异,只不过命令改为了Linux下的情况。${inf//out/png}代表把$inf变量记录的文件名的out后缀替换为png。

为了用起来更方便,读者还可以把batchspec.sh和UV-Vis.txt放到比如/sob目录下,把./batchspec.sh里的UV-Vis.txt改为/sob/UV-Vis.txt,然后在~/.bashrc文件里增加一行
alias UV='/sob/batchspec.sh'
alias gUV='gedit /sob/UV-Vis.txt'

重新进入终端后,只要某个目录里有比如Gaussian的电子激发任务的输出文件,就在这个目录下运行UV命令即可将它们全都瞬间转化为UV-Vis光谱文件。如果发现坐标范围不合适,输入gUV命令就可以启动gedit编辑UV-Vis.txt的内容。


3 总结

希望读者举一反三,效仿本文的运行方式,使得Multiwfn实现其它任务的批量处理。笔者的很多与Multiwfn有关的博文都充分利用了批处理文件,比如《使用Multiwfn做空穴-电子分析全面考察电子激发特征》(http://sobereva.com/434)、《使用Multiwfn做自然跃迁轨道(NTO)分析》(http://sobereva.com/377)、《使用Multiwfn绘制跃迁密度矩阵和电荷转移矩阵考察电子激发特征》(http://sobereva.com/436)、《通过键级曲线和ELF/LOL/RDG等值面动画研究化学反应过程》(http://sobereva.com/200)等等,读者可参考之,写出功能更强的批处理脚本。
作者
Author:
Evanwill    时间: 2019-4-29 20:52
这个不错,什么时候升级一下一键绘制构象权重平均的光谱
作者
Author:
lonemen    时间: 2019-4-29 21:02
太赞啦,谢谢sob老师!
作者
Author:
sobereva    时间: 2019-4-30 04:22
Evanwill 发表于 2019-4-29 20:52
这个不错,什么时候升级一下一键绘制构象权重平均的光谱

我觉得没有好升级的,目前Multiwfn绘制构象平均光谱已经超级方便了
作者
Author:
Novice    时间: 2020-4-10 13:16
本帖最后由 Novice 于 2020-4-10 13:27 编辑

求助社长,我在使用此功能批量产生raman光谱时使用了附件中的执行文件,执行完成后,屏幕上出现了以报错信息:
forrtl: severe (24): end-of-file during read, unit -4, file /proc/66240/fd/0
Image              PC                Routine            Line        Source            
mwfn               0000000001AE486B  Unknown               Unknown  Unknown
mwfn               0000000001B0F412  Unknown               Unknown  Unknown
mwfn               000000000076325D  Unknown               Unknown  Unknown
mwfn               00000000007A613F  Unknown               Unknown  Unknown
mwfn               0000000000430922  Unknown               Unknown  Unknown
libc-2.27.so       0000147E70101B97  __libc_start_main     Unknown  Unknown
mwfn               0000000000430829  Unknown               Unknown  Unknown


虽然报错,但是却产生了我需要导出的光谱文件。请问产生这个报错的原因是什么?还有两个疑问:
1.有的操作需要直接回车,请问我在编写multiwfn执行步骤文件raman时直接回车空一行对吗(比如此文件第6行)?
2.multiwfn执行步骤文件raman中不需写使其正常结束的操作吗?(我考虑我遇到的错误是不是和这个有关?)

注:a. 单独使用multiwfn没有问题;
b.为了方便我将multiwfn手动改名为了mwfn,所用系统为ubuntu 18.04.



作者
Author:
sobereva    时间: 2020-4-11 23:13
Novice 发表于 2020-4-10 13:16
求助社长,我在使用此功能批量产生raman光谱时使用了附件中的执行文件,执行完成后,屏幕上出现了以报错信 ...

1 因为强行退出Multiwfn,所以出现“报错”。如果不想出现这些碍眼的信息,修改脚本,让程序退回到主菜单,然后用选项-10或者命令q优雅地退出

2 不需要
作者
Author:
sealanlan    时间: 2020-10-3 20:21
感谢感谢社长,学习了一下午,终于搞明白批处理了。。。。。
补充一个,因为想输出txt格式的UV-vis数据后,再自己做图,批处理文件.bat我这么设定的:
for /f %%i in ('dir *.log /b') do (
Multiwfn %%i < UV-Vis.txt > NUL
rename spectrum_curve.txt %%~ni.txt
)

UV-Vis.txt我的设定是:
11
3
0
8
0.4
2

很快一键搞定所有UV-Vis曲线的txt文件了

作者
Author:
LittlePupil    时间: 2023-3-13 14:46
本帖最后由 LittlePupil 于 2023-3-13 15:20 编辑

《使用Multiwfn绘制红外、拉曼、UV-Vis、ECD、VCD和ROA光谱图》(http://sobereva.com/224)里有这么一句:
吐血建议使用pdf格式保存图像,这样线条和文字都比用png等位图格式清晰平滑得多!

所以对于Linux系统,可以在记录传递给Multiwfn命令的txt文件的保存图像命令前加入下面两行:
-4  //Set format of saved graphical file
7  //pdf format
然后将shell脚本改为
  1. #!/bin/bash
  2. for inf in *.out
  3. do
  4. Multiwfn ${inf} < UV-Vis.txt > /dev/null
  5. pdftoppm -png dislin.pdf dislin
  6. rm dislin.pdf
  7. mv -f dislin-1.png ${inf//out/png}
  8. done
复制代码

即令Multiwfn产生pdf格式的图像文件后利用pdftoppm直接将其转为png格式,其中pdftoppm是poppler-utils的一个组件,安装方法请自行百度,实测图像效果确实有明显提升。




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