计算化学公社

标题: 一个自动输出HOMO-LUMO分子轨道以及附近轨道的脚本 [打印本页]

作者
Author:
exity    时间: 2021-3-16 11:07
标题: 一个自动输出HOMO-LUMO分子轨道以及附近轨道的脚本
本帖最后由 exity 于 2021-3-30 22:47 编辑

2021.03.30 更新了脚本,实现如下功能1 更清楚的屏幕输出
2 批量处理多个fchk文件并将生成的cub文件移入同名文件夹
3 输出的cub文件按照分子轨道顺序编号并对homo lumo轨道进行额外标记
4 改变屏幕输出的字体和背景颜色.......没什么用的功能
(, 下载次数 Times of downloads: 48)

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


(, 下载次数 Times of downloads: 46)
===================================================

#!/bin/bash
abovelumo=2
belowhomo=2
frontcolor=36               #字体颜色 30:黑 31:红 32:绿 33:黄 34:蓝色 35:紫色 36:深绿 37:白色
backgroundcolor=40          #背景颜色 40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色
for inf in *.fchk
    do (
    echo 0 > tmp.mf                                                                                                                                 #建立内容为0的mf文件,供multiwfn使用输出含有HOMO LUMO编号内容的txt
    Multiwfn ${inf} < tmp.mf > ${inf//.fchk}.tmp
    h=$(grep "is HOMO" ${inf//.fchk}.tmp | awk '{print $3}')  #抓取含有is HOMO字段的行并提取第3列数据
    l=$(grep "is LUMO" ${inf//.fchk}.tmp | awk '{print $2}')  #抓取含有is LUMO字段的行并提取第2列数据
    range=$[$h-$belowhomo]'-'$[$l+$abovelumo]
    echo -e "\033[1;${frontcolor};${backgroundcolor}mThe file being processed is ${inf}, all cube files will be moved into the folder with same name.\033[0m"
    printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your highest is $[$l+$abovelumo]
    printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your lumo    is $l
    printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your homo    is $h
    printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-15s\n\033[0m" Your lowest  is $[$h-$belowhomo]
    printf "%-4s %-7s %-2s \033[1;${frontcolor};${backgroundcolor}m%-5s %-2s \033[0m%-8s %-2s %-5s\n" Your range is $range, $[$abovelumo+$belowhomo+2] orbitals in total.
    echo -e "\033[1;${frontcolor};${backgroundcolor}mMoment please, cube files are be generated by Multiwfn...\033[0m"
    echo $range > tmp3.txt
    echo 200 >> tmp2.mf                 #进入主功能200
    echo 3 >> tmp2.mf                   #生成轨道波函数文件
    cat tmp3.txt >> tmp2.mf             #不知道为什么这里echo $range >> 不能用
    echo 3 >> tmp2.mf                   #输出高质量格点,1,2分别对应低和中等质量
    echo 1 >> tmp2.mf                   #分别输出轨道cub文件
    Multiwfn ${inf} < tmp2.mf >> null
    rm ${inf//.fchk}.tmp tmp.mf tmp3.txt tmp2.mf null
    mv "orb$(printf "%06d" ${h}).cub" "orb$(printf "%06d" ${h})_homo.cub"                #输出6位自动补0的HOMO轨道编号
    mv "orb$(printf "%06d" ${l}).cub" "orb$(printf "%06d" ${l})_lumo.cub"                #输出6位自动补0的HOMO轨道编号
    mkdir ${inf//.fchk}
    mv *cub ${inf//.fchk}
    # ####test code####
    # #echo h=$(sed -n 1p homo.txt)
    # #echo l=$(sed -n 1p lumo.txt)
    )
done

===================================================

缘起:有次考察分子轨道的时候,想批量输出HOMOLUMO附近正负3的轨道,脑洞一开,在输入分子轨道编号的时候在Multiwfn里输入了如下命令
h-3,h-2,h-1,h,l,l+1,l+2,l+3
当然运行失败,恳请社长修改代码未遂之后,受社长提示用脚本来干这个事情。
[attach]32961[/attach]
跌跌撞撞写了一个功能上能用的,但是语法很啰嗦的sh脚本,现在发出来供大家批评,如果有人能提供一样功能又简洁优美的脚本那就太好了。
使用方法
和fchk文件放在同一目录,修开头两行的数字,分别代表输入高于LUMO的几个轨道,低于HOMO的几个轨道,我测试过正整数和零,没有什么问题,没有测试负数以及其他奇怪的字符,请读者自行尝试。
例如,如果你要输出LUMO以上3个轨道,HOMO以下4个轨道,就改为下面这样。
abovelumo=3
belowhomo=4


非要说这个脚本有什么好处,恐怕就是不需要每次都点0功能,肉眼看HOMO LUMO对应的编号了吧。
感觉也没什么用的样子.....

#!/bin/bash
abovelumo=2
belowhomo=2
for ((l=1;l<=${abovelumo};l++))
do
echo l+$[$[${abovelumo}+1]-${l}] >> tmp.txt
done
echo l >> tmp.txt
echo h >> tmp.txt
for ((h=-1;h>=-${belowhomo};h--))
do
echo h${h} >> tmp.txt
done
for ((n=1;n<=$[${abovelumo}+${belowhomo}+2];n++))
do
touch tmp2.mf
echo 200 >> tmp2.mf                 #进入主功能200
echo 3 >> tmp2.mf                   #生成轨道波函数文件
echo replacedwithx >> tmp2.mf       #输入轨道序号,这里使用随意字符,后续会用变量代替
echo 3 >> tmp2.mf                   #输出高质量格点,1,2分别对应低和中等质量
echo 1 >> tmp2.mf                   #分别输出轨道cub文件
x=$(sed -n ${n}p tmp.txt)
cp tmp2.mf ${x}_showorb.mf
sed -i "3c ${x}" ${x}_showorb.mf
    for inf in *.fchk
    do (
    Multiwfn ${inf} < ${x}_showorb.mf
    )
    done
done
mkdir ${inf//.fchk}_orbs
mv *.cub ${inf//.fchk}_orbs
rm *.mf tmp.txt









作者
Author:
lonemen    时间: 2021-6-23 09:25
厉害厉害,谢谢分享!
作者
Author:
Novice    时间: 2023-5-17 14:04
本帖最后由 Novice 于 2023-5-17 17:49 编辑

2023.5.17 优化了脚本:
1. 使得运行脚本时Multiwfn不弹窗;
2. 屏幕不输出非优雅退出Multiwfn的报错信息;
3. 将所有分子的HOMO/LUMO能级值输出到Orb_Val_Sum.txt文件中。
作者
Author:
exity    时间: 2023-5-17 16:55
Novice 发表于 2023-5-17 14:04
2023.5.17 优化了脚本:
1. 使得Multiwfn不弹窗;
2. 屏幕不输出非优雅退出Multiwfn的报错信息;

万万没想到,我这小破脚本还能被二次开发!
作者
Author:
Novice    时间: 2023-5-17 17:34
exity 发表于 2023-5-17 16:55
万万没想到,我这小破脚本还能被二次开发!

您写的很好,我一看就喜欢上了。实际用了下发现些许不足,所以又简单修改了一下




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