计算化学公社
标题:
一个自动做批量构象搜索的脚本(调用xtb、crest结合Molclus中的isostat)
[打印本页]
作者Author:
Senn
时间:
2025-4-23 18:35
标题:
一个自动做批量构象搜索的脚本(调用xtb、crest结合Molclus中的isostat)
本帖最后由 Senn 于 2025-4-23 18:35 编辑
因为本人的研究时常要做构象搜索,参考群主的文章:
使用Molclus结合xtb做的动力学模拟对瑞德西韦(Remdesivir)做构象搜索 - 量子化学 (Quantum Chemistry) - 计算化学公社 (keinsci.com)
对每个分子一步步做操作很繁琐,尤其是很多个分子都要算的时候
所以写了两个脚本,一个是对单个结构做计算,一个是对文件夹里的所有.xyz文件做计算
需要调用xtb、crest和molclus里的isostat工具,安装参考前面的文章
这里将isostat拷贝到工作文件夹中,加上md.inp(内容参考群主的文章)就可以使用
(, 下载次数 Times of downloads: 128)
上传 Uploaded
点击下载Click to download
(, 下载次数 Times of downloads: 134)
上传 Uploaded
点击下载Click to download
大概流程是先调用xtb跑动力学模拟,再通过crest调用xtb做批量结构优化,再通过群主的isostat工具做去重和排序,再通过更高精度的结构优化和去重排序
计算级别:跑MD用的是gfnff,因为测试gfn0老容易出现断键、反应的情况,gfnff精度也够用。第一次结构优化是真空下的gfnff,可以改成gfn0,第二次是gfn2在隐式水模型下
调用方式:通过chmod +x ./CS.sh命令加上权限后,通过./CS.sh filename.xyz计算单个结构的构象搜索
也可以通过./CS_batch.sh filename调用文件夹filename中所有的.xyz挨个计算,最后结果和中间文件会通过创建文件夹md、opt1、opt2和results进行分类保存
脚本做了详细标注,所以很容易修改计算关键词,改流程等等。
CS.sh:
#!/bin/bash
set -euo pipefail
# 检查输入参数
if [ $# -ne 1 ]; then
echo "用法: $0 <xyz文件>"
echo "示例: $0 molecule.xyz"
exit 1
fi
xyz_file=$1
inp_file="md.inp" # 自动使用当前目录下的md.inp文件
# 检查文件是否存在
if [ ! -f "$xyz_file" ]; then
echo "错误: XYZ文件 $xyz_file 不存在"
exit 1
fi
if [ ! -f "$inp_file" ]; then
echo "错误: INP文件 $inp_file 不存在"
exit 1
fi
# 从xyz文件名提取基础名称(不含扩展名)
filename=$(basename "$xyz_file" .xyz)
md_dir="md_${filename}"
# 创建目录(如果不存在)
mkdir -p "$md_dir"
echo "开始执行xtb动力学模拟..."
echo "使用文件: $xyz_file 和 $inp_file"
echo "结果将保存在目录: $md_dir"
# 进入目录执行xtb
(
cd "$md_dir" || exit
xtb "../$xyz_file" --input "../$inp_file" --omd --gfnff
)
echo "模拟完成!结果保存在${md_dir}目录"
# 复制轨迹文件并创建opt目录
opt1_dir="opt1_${filename}"
mkdir -p "$opt1_dir"
mdtraj_file="mdtraj_${filename}.xyz"
# 复制并重命名轨迹文件
cp "${md_dir}/xtb.trj" "${opt1_dir}/${mdtraj_file}"
echo "开始执行CREST进行结构优化..."
echo "使用轨迹文件: ${mdtraj_file}"
# 在opt1目录中执行crest
(
cd "$opt1_dir" || exit
crest -mdopt "$mdtraj_file" -gfnff -opt normal -niceprint
)
echo "CREST第一次批量优化计算完成!结果保存在 ${opt1_dir} 目录"
# 复制crest_ensemble.xyz并重命名
cp "${opt1_dir}/crest_ensemble.xyz" "./isomers.xyz"
echo "开始使用isostat进行构象去重..."
echo "交互输入顺序: 1.回车 2.0.5 3.0.5 4.回车"
# 使用here document进行交互式输入
./isostat <<EOF
0.5
0.5
EOF
echo "isostat第一次去重完成!"
# 移动isomers.xyz到opt1目录
mv "./isomers.xyz" "${opt1_dir}/isomers.xyz"
# 重命名cluster.xyz并创建opt2目录
cluster0_file="cluster0_${filename}.xyz"
opt2_dir="opt2_${filename}"
mkdir -p "$opt2_dir"
# 移动重命名后的cluster文件到opt2目录
mv "./cluster.xyz" "${opt2_dir}/${cluster0_file}"
echo "开始执行CREST第二次优化计算..."
echo "使用文件: ${cluster0_file}"
# 在opt2目录中执行crest
(
cd "$opt2_dir" || exit
crest -mdopt "$cluster0_file" -gfn2 -opt normal -g h2o -niceprint
)
echo "CREST第二次优化计算完成!结果保存在 ${opt2_dir} 目录"
# 第二次去重操作
# 复制crest_ensemble.xyz并重命名
cp "${opt2_dir}/crest_ensemble.xyz" "./isomers.xyz"
echo "开始使用isostat进行第二次构象去重..."
echo "交互输入顺序: 1.回车 2.0.5 3.0.5 4.回车"
# 使用here document进行交互式输入
./isostat <<EOF
0.5
0.5
298.15
EOF
echo "isostat第二次去重完成!"
# 移动isomers.xyz到opt2目录
mv "./isomers.xyz" "${opt2_dir}/isomers.xyz"
# 重命名cluster.xyz
cluster_file="cluster_${filename}.xyz"
mv "./cluster.xyz" "./${cluster_file}"
echo "最终构象结果保存在: ${cluster_file}"
复制代码
CS_batch.sh:
#!/bin/bash
set -euo pipefail
# 检查输入参数
if [ $# -ne 1 ]; then
echo "用法: $0 <xyz文件夹>"
echo "示例: $0 xyz_files"
exit 1
fi
xyz_dir=$1
inp_file="md.inp" # 自动使用当前目录下的md.inp文件
# 检查文件夹是否存在
if [ ! -d "$xyz_dir" ]; then
echo "错误: XYZ文件夹 $xyz_dir 不存在"
exit 1
fi
if [ ! -f "$inp_file" ]; then
echo "错误: INP文件 $inp_file 不存在"
exit 1
fi
# 创建主输出目录
mkdir -p md opt1 opt2 results
# 遍历xyz文件夹中的所有.xyz文件
for xyz_file in "$xyz_dir"/*.xyz; do
# 从xyz文件名提取基础名称(不含扩展名)
filename=$(basename "$xyz_file" .xyz)
echo "开始处理文件: $xyz_file"
# 创建各阶段目录
md_subdir="md/md_${filename}"
opt1_subdir="opt1/opt1_${filename}"
opt2_subdir="opt2/opt2_${filename}"
mkdir -p "$md_subdir" "$opt1_subdir" "$opt2_subdir"
echo "开始执行xtb动力学模拟..."
echo "使用文件: $xyz_file 和 $inp_file"
echo "结果将保存在目录: $md_subdir" # 修改此处,将md_dir改为md_subdir
# 进入目录执行xtb
(
cd "$md_subdir" || exit
xtb "../../$xyz_file" --input "../../$inp_file" --omd --gfnff
)
# 复制轨迹文件
mdtraj_file="mdtraj_${filename}.xyz"
cp "${md_subdir}/xtb.trj" "${opt1_subdir}/${mdtraj_file}"
# 执行CREST第一次优化
(
cd "$opt1_subdir" || exit
crest -mdopt "$mdtraj_file" -gfnff -opt normal -niceprint
)
cp "${opt1_subdir}/crest_ensemble.xyz" "./isomers.xyz"
# 第一次isostat去重
./isostat <<EOF
0.5
0.5
EOF
mv "./isomers.xyz" "${opt1_subdir}/isomers.xyz"
cluster0_file="cluster0_${filename}.xyz"
mv "./cluster.xyz" "${opt2_subdir}/${cluster0_file}"
# 执行CREST第二次优化
(
cd "$opt2_subdir" || exit
crest -mdopt "$cluster0_file" -gfn2 -opt normal -g h2o -niceprint
)
# 第二次isostat去重
cp "${opt2_subdir}/crest_ensemble.xyz" "./isomers.xyz"
./isostat <<EOF
0.5
0.5
EOF
mv "./isomers.xyz" "${opt2_subdir}/isomers.xyz"
# 移动最终结果到results目录
cluster_file="results/cluster_${filename}.xyz"
mv "./cluster.xyz" "$cluster_file"
echo "文件 $xyz_file 处理完成!最终结果保存在: $cluster_file"
done
echo "所有文件处理完成!"
复制代码
作者Author:
influenza
时间:
2025-7-10 10:18
感谢楼主好东东!问一下,在哪里指定体系的电荷和自旋多重度信息?
作者Author:
Senn
时间:
2025-7-28 19:34
influenza 发表于 2025-7-10 10:18
感谢楼主好东东!问一下,在哪里指定体系的电荷和自旋多重度信息?
才看到不好意思哈,执行xtb和执行crest的关键词那里设置,关键词是chrg和uhf 比如xtb的话就是 --chrg 0 --uhf 0, crest就是 -chrg 0 -uhf 0
欢迎光临 计算化学公社 (http://bbs.keinsci.com/)
Powered by Discuz! X3.3