计算化学公社

 找回密码 Forget password
 注册 Register
Views: 874|回复 Reply: 2
打印 Print 上一主题 Last thread 下一主题 Next thread

[程序/脚本开发] 一个自动做批量构象搜索的脚本(调用xtb、crest结合Molclus中的isostat)

[复制链接 Copy URL]

13

帖子

0

威望

330

eV
积分
343

Level 3 能力者

本帖最后由 Senn 于 2025-4-23 18:35 编辑

因为本人的研究时常要做构象搜索,参考群主的文章:使用Molclus结合xtb做的动力学模拟对瑞德西韦(Remdesivir)做构象搜索 - 量子化学 (Quantum Chemistry) - 计算化学公社 (keinsci.com)
对每个分子一步步做操作很繁琐,尤其是很多个分子都要算的时候
所以写了两个脚本,一个是对单个结构做计算,一个是对文件夹里的所有.xyz文件做计算
需要调用xtb、crest和molclus里的isostat工具,安装参考前面的文章
这里将isostat拷贝到工作文件夹中,加上md.inp(内容参考群主的文章)就可以使用

大概流程是先调用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:
  1. #!/bin/bash
  2. set -euo pipefail

  3. # 检查输入参数
  4. if [ $# -ne 1 ]; then
  5.     echo "用法: $0 <xyz文件>"
  6.     echo "示例: $0 molecule.xyz"
  7.     exit 1
  8. fi

  9. xyz_file=$1
  10. inp_file="md.inp"  # 自动使用当前目录下的md.inp文件

  11. # 检查文件是否存在
  12. if [ ! -f "$xyz_file" ]; then
  13.     echo "错误: XYZ文件 $xyz_file 不存在"
  14.     exit 1
  15. fi

  16. if [ ! -f "$inp_file" ]; then
  17.     echo "错误: INP文件 $inp_file 不存在"
  18.     exit 1
  19. fi

  20. # 从xyz文件名提取基础名称(不含扩展名)
  21. filename=$(basename "$xyz_file" .xyz)
  22. md_dir="md_${filename}"

  23. # 创建目录(如果不存在)
  24. mkdir -p "$md_dir"

  25. echo "开始执行xtb动力学模拟..."
  26. echo "使用文件: $xyz_file 和 $inp_file"
  27. echo "结果将保存在目录: $md_dir"

  28. # 进入目录执行xtb
  29. (
  30.     cd "$md_dir" || exit
  31.     xtb "../$xyz_file" --input "../$inp_file" --omd --gfnff
  32. )

  33. echo "模拟完成!结果保存在${md_dir}目录"

  34. # 复制轨迹文件并创建opt目录
  35. opt1_dir="opt1_${filename}"
  36. mkdir -p "$opt1_dir"
  37. mdtraj_file="mdtraj_${filename}.xyz"

  38. # 复制并重命名轨迹文件
  39. cp "${md_dir}/xtb.trj" "${opt1_dir}/${mdtraj_file}"

  40. echo "开始执行CREST进行结构优化..."
  41. echo "使用轨迹文件: ${mdtraj_file}"

  42. # 在opt1目录中执行crest
  43. (
  44.     cd "$opt1_dir" || exit
  45.     crest -mdopt "$mdtraj_file" -gfnff -opt normal -niceprint
  46. )

  47. echo "CREST第一次批量优化计算完成!结果保存在 ${opt1_dir} 目录"

  48. # 复制crest_ensemble.xyz并重命名
  49. cp "${opt1_dir}/crest_ensemble.xyz" "./isomers.xyz"

  50. echo "开始使用isostat进行构象去重..."
  51. echo "交互输入顺序: 1.回车 2.0.5 3.0.5 4.回车"

  52. # 使用here document进行交互式输入
  53. ./isostat <<EOF

  54. 0.5
  55. 0.5

  56. EOF

  57. echo "isostat第一次去重完成!"

  58. # 移动isomers.xyz到opt1目录
  59. mv "./isomers.xyz" "${opt1_dir}/isomers.xyz"

  60. # 重命名cluster.xyz并创建opt2目录
  61. cluster0_file="cluster0_${filename}.xyz"
  62. opt2_dir="opt2_${filename}"
  63. mkdir -p "$opt2_dir"

  64. # 移动重命名后的cluster文件到opt2目录
  65. mv "./cluster.xyz" "${opt2_dir}/${cluster0_file}"

  66. echo "开始执行CREST第二次优化计算..."
  67. echo "使用文件: ${cluster0_file}"

  68. # 在opt2目录中执行crest
  69. (
  70.     cd "$opt2_dir" || exit
  71.     crest -mdopt "$cluster0_file" -gfn2 -opt normal -g h2o -niceprint
  72. )

  73. echo "CREST第二次优化计算完成!结果保存在 ${opt2_dir} 目录"

  74. # 第二次去重操作
  75. # 复制crest_ensemble.xyz并重命名
  76. cp "${opt2_dir}/crest_ensemble.xyz" "./isomers.xyz"

  77. echo "开始使用isostat进行第二次构象去重..."
  78. echo "交互输入顺序: 1.回车 2.0.5 3.0.5 4.回车"

  79. # 使用here document进行交互式输入
  80. ./isostat <<EOF

  81. 0.5
  82. 0.5
  83. 298.15

  84. EOF

  85. echo "isostat第二次去重完成!"

  86. # 移动isomers.xyz到opt2目录
  87. mv "./isomers.xyz" "${opt2_dir}/isomers.xyz"

  88. # 重命名cluster.xyz
  89. cluster_file="cluster_${filename}.xyz"
  90. mv "./cluster.xyz" "./${cluster_file}"

  91. echo "最终构象结果保存在: ${cluster_file}"

复制代码

CS_batch.sh:
  1. #!/bin/bash
  2. set -euo pipefail

  3. # 检查输入参数
  4. if [ $# -ne 1 ]; then
  5.     echo "用法: $0 <xyz文件夹>"
  6.     echo "示例: $0 xyz_files"
  7.     exit 1
  8. fi

  9. xyz_dir=$1
  10. inp_file="md.inp"  # 自动使用当前目录下的md.inp文件

  11. # 检查文件夹是否存在
  12. if [ ! -d "$xyz_dir" ]; then
  13.     echo "错误: XYZ文件夹 $xyz_dir 不存在"
  14.     exit 1
  15. fi

  16. if [ ! -f "$inp_file" ]; then
  17.     echo "错误: INP文件 $inp_file 不存在"
  18.     exit 1
  19. fi

  20. # 创建主输出目录
  21. mkdir -p md opt1 opt2 results

  22. # 遍历xyz文件夹中的所有.xyz文件
  23. for xyz_file in "$xyz_dir"/*.xyz; do
  24.     # 从xyz文件名提取基础名称(不含扩展名)
  25.     filename=$(basename "$xyz_file" .xyz)
  26.    
  27.     echo "开始处理文件: $xyz_file"
  28.    
  29.     # 创建各阶段目录
  30.     md_subdir="md/md_${filename}"
  31.     opt1_subdir="opt1/opt1_${filename}"
  32.     opt2_subdir="opt2/opt2_${filename}"
  33.    
  34.     mkdir -p "$md_subdir" "$opt1_subdir" "$opt2_subdir"

  35.     echo "开始执行xtb动力学模拟..."
  36.     echo "使用文件: $xyz_file 和 $inp_file"
  37.     echo "结果将保存在目录: $md_subdir"  # 修改此处,将md_dir改为md_subdir

  38.     # 进入目录执行xtb
  39.     (
  40.         cd "$md_subdir" || exit
  41.         xtb "../../$xyz_file" --input "../../$inp_file" --omd --gfnff
  42.     )

  43.     # 复制轨迹文件
  44.     mdtraj_file="mdtraj_${filename}.xyz"
  45.     cp "${md_subdir}/xtb.trj" "${opt1_subdir}/${mdtraj_file}"

  46.     # 执行CREST第一次优化
  47.     (
  48.         cd "$opt1_subdir" || exit
  49.         crest -mdopt "$mdtraj_file" -gfnff -opt normal -niceprint
  50.     )

  51.     cp "${opt1_subdir}/crest_ensemble.xyz" "./isomers.xyz"

  52.     # 第一次isostat去重
  53.     ./isostat <<EOF

  54.     0.5
  55.     0.5

  56. EOF

  57.     mv "./isomers.xyz" "${opt1_subdir}/isomers.xyz"
  58.     cluster0_file="cluster0_${filename}.xyz"
  59.     mv "./cluster.xyz" "${opt2_subdir}/${cluster0_file}"

  60.     # 执行CREST第二次优化
  61.     (
  62.         cd "$opt2_subdir" || exit
  63.         crest -mdopt "$cluster0_file" -gfn2 -opt normal -g h2o -niceprint
  64.     )

  65.     # 第二次isostat去重
  66.     cp "${opt2_subdir}/crest_ensemble.xyz" "./isomers.xyz"
  67.    
  68.     ./isostat <<EOF

  69.     0.5
  70.     0.5

  71. EOF

  72.     mv "./isomers.xyz" "${opt2_subdir}/isomers.xyz"
  73.     # 移动最终结果到results目录
  74.     cluster_file="results/cluster_${filename}.xyz"
  75.     mv "./cluster.xyz" "$cluster_file"

  76.     echo "文件 $xyz_file 处理完成!最终结果保存在: $cluster_file"
  77. done

  78. echo "所有文件处理完成!"
复制代码





评分 Rate

参与人数
Participants 4
eV +12 收起 理由
Reason
mxjscu + 4 好物!
Serious + 2 赞!
hcy002 + 1
gyp + 5 谢谢分享

查看全部评分 View all ratings

37

帖子

0

威望

389

eV
积分
426

Level 3 能力者

2#
发表于 Post on 2025-7-10 10:18:34 | 只看该作者 Only view this author
感谢楼主好东东!问一下,在哪里指定体系的电荷和自旋多重度信息?

13

帖子

0

威望

330

eV
积分
343

Level 3 能力者

3#
 楼主 Author| 发表于 Post on 2025-7-28 19:34:45 | 只看该作者 Only view this author
influenza 发表于 2025-7-10 10:18
感谢楼主好东东!问一下,在哪里指定体系的电荷和自旋多重度信息?

才看到不好意思哈,执行xtb和执行crest的关键词那里设置,关键词是chrg和uhf   比如xtb的话就是 --chrg 0 --uhf 0, crest就是  -chrg 0 -uhf 0

本版积分规则 Credits rule

手机版 Mobile version|北京科音自然科学研究中心 Beijing Kein Research Center for Natural Sciences|京公网安备 11010502035419号|计算化学公社 — 北京科音旗下高水平计算化学交流论坛 ( 京ICP备14038949号-1 )|网站地图

GMT+8, 2025-8-13 03:55 , Processed in 0.637733 second(s), 24 queries , Gzip On.

快速回复 返回顶部 返回列表 Return to list