0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

QM/MM幾何構(gòu)型優(yōu)化計(jì)算的python腳本

鴻之微 ? 來源:鴻之微 ? 作者:鴻之微 ? 2022-07-21 15:20 ? 次閱讀

QM/MM結(jié)構(gòu)優(yōu)化

QM/MM幾何構(gòu)型優(yōu)化計(jì)算的python腳本如下:

import glob, math, os.path

from pBabel import AmberCrdFile_ToCoordinates3,

AmberTopologyFile_ToSystem ,

SystemGeometryTrajectory ,

AmberCrdFile_FromSystem ,

PDBFile_FromSystem ,

XYZFile_FromSystem

from pCore import Clone, logFile, Selection

from pMolecule import NBModelORCA, QCModelBDF, System

from pMoleculeScripts import ConjugateGradientMinimize_SystemGeometry,

FIREMinimize_SystemGeometry ,

LBFGSMinimize_SystemGeometry ,

SteepestDescentMinimize_SystemGeometry

# 定義結(jié)構(gòu)優(yōu)化接口

def opt_ConjugateGradientMinimize(molecule, selection):

molecule.DefineFixedAtoms(selection) #固定原子

#定義優(yōu)化方法

ConjugateGradientMinimize_SystemGeometry(

molecule,

maximumIterations = 40, # 最大優(yōu)化步數(shù)

rmsGradientTolerance = 0.1, #優(yōu)化收斂控制

trajectories = [(trajectory, 1)]

) # 定義軌跡保存頻率

# 定義能量計(jì)算模式

nbModel = NBModelORCA()

qcModel = QCModelBDF("GB3LYP:6-31g")

# 讀取體系坐標(biāo)和拓?fù)?a target="_blank">信息

molecule = AmberTopologyFile_ToSystem ("GallicAcid.prmtop")

molecule.coordinates3 = AmberCrdFile_ToCoordinates3("GallicAcid.crd")

# 關(guān)閉體系對(duì)稱性

molecule.DefineSymmetry(crystalClass = None) #QM/MM方法不支持使用周期性邊界條件

#. Define Atoms List

natoms = len(molecule.atoms) # 系統(tǒng)中總原子數(shù)

qm_list = range(72, 90) # QM 區(qū)原子

activate_list = range(126, 144) + range (144, 162) # MM區(qū)活性原子(優(yōu)化中可以移動(dòng))

#定義MM區(qū)原子

mm_list = range (natoms)

for i in qm_list:

mm_list.remove(i) # MM 刪除QM原子

mm_inactivate_list = mm_list[:]

for i in activate_list :

mm_inactivate_list.remove(i)

# 輸入QM原子

qmmmtest_qc = Selection.FromIterable(qm_list)

# 定義各選擇區(qū)

selection_qm_mm_inactivate = Selection.FromIterable(qm_list + mm_inactivate_list)

selection_mm = Selection.FromIterable(mm_list)

selection_mm_inactivate = Selection.FromIterable(mm_inactivate_list)

# . Define the energy model.

molecule.DefineQCModel(qcModel, qcSelection = qmmmtest_qc)

molecule.DefineNBModel(nbModel)

molecule.Summary()

#計(jì)算優(yōu)化開始時(shí)總能量

eStart = molecule.Energy()

#定義輸出文件目錄名

outlabel = 'opt_watbox_bdf'

if os.path.exists(outlabel):

pass

else:

os.mkdir (outlabel)

outlabel = outlabel + '/' + outlabel

# 定義輸出軌跡

trajectory = SystemGeometryTrajectory (outlabel + ".trj" , molecule, mode = "w")

# 開始第一階段優(yōu)化

# 定義優(yōu)化兩步

iterations = 2

# 順次固定QM區(qū)和MM區(qū)進(jìn)行優(yōu)化

for i in range(iterations):

opt_ConjugateGradientMinimize(molecule, selection_qm_mm_inactivate) #固定QM區(qū)優(yōu)化

opt_ConjugateGradientMinimize(molecule, selection_mm) #固定MM區(qū)優(yōu)化

# 開始第二階段優(yōu)化

# QM區(qū)和MM區(qū)同時(shí)優(yōu)化

opt_ConjugateGradientMinimize(molecule, selection_mm_inactivate)

#輸出優(yōu)化后總能量

eStop = molecule.Energy()

#保存優(yōu)化坐標(biāo),可以為xyz/crd/pdb等。

XYZFile_FromSystem(outlabel + ".xyz", molecule)

AmberCrdFile_FromSystem(outlabel + ".crd" , molecule)

PDBFile_FromSystem(outlabel + ".pdb" , molecule)

輸出體系收斂信息如下(此處僅展示前20步優(yōu)化收斂結(jié)果):

----------------------------------------------------------------------------------------------------------------

Iteration Function RMS Gradient Max. |Grad.| RMS Disp. Max. |Disp.|

----------------------------------------------------------------------------------------------------------------

0 I -1696839.69778731 2.46510318 9.94250232 0.00785674 0.03168860

2 L1s -1696839.82030342 1.38615730 5.83254788 0.00043873 0.00126431

4 L1s -1696839.90971371 1.41241184 5.29242524 0.00067556 0.00172485

6 L0s -1696840.01109863 1.41344485 4.70119338 0.00090773 0.00265969

8 L1s -1696840.09635696 1.44964059 5.72496661 0.00108731 0.00328490

10 L1s -1696840.17289698 1.28607709 4.73666387 0.00108469 0.00354577

12 L1s -1696840.23841524 1.03217304 3.00441004 0.00081945 0.00267931

14 L1s -1696840.30741088 1.40349698 5.22220965 0.00162080 0.00519590

16 L1s -1696840.43546466 1.32604042 4.51175225 0.00158796 0.00455431

18 L0s -1696840.52547251 1.27123125 4.20616166 0.00158796 0.00428040

20 L0s -1696840.60265453 1.08553355 3.12355616 0.00158796 0.00470223

----------------------------------------------------------------------------------------------------------------

輸出體系總能量信息如下:

9fc1cc7a-080b-11ed-ba43-dac502259ad0.png

注:QM/MM幾何構(gòu)型優(yōu)化一般不容易收斂,在實(shí)際操作中需要的技巧較多。常見的有,固定MM區(qū),優(yōu)化QM區(qū);然后固定QM區(qū)優(yōu)化MM區(qū)。如此往復(fù)循環(huán)幾次后,再同時(shí)優(yōu)化QM區(qū)和MM區(qū)。優(yōu)化是否收斂,和QM區(qū)的選擇及QM/MM邊界是否有帶電較多的原子等關(guān)系很大。為了加速優(yōu)化,可以在計(jì)算時(shí)固定MM區(qū),僅選擇離QM區(qū)較近的合適區(qū)域,作為活性區(qū)域,在優(yōu)化中坐標(biāo)可以變化。

QM/MM激發(fā)態(tài)計(jì)算

基于上一步的QM/MM幾何構(gòu)型優(yōu)化,繼而即可將MM區(qū)活性原子添加到QM區(qū)進(jìn)行QM/MM-TDDFT計(jì)算,完整的代碼如下:

import glob, math, os.path

from pBabel import AmberCrdFile_ToCoordinates3,

AmberTopologyFile_ToSystem ,

SystemGeometryTrajectory ,

AmberCrdFile_FromSystem ,

PDBFile_FromSystem ,

XYZFile_FromSystem

from pCore import Clone, logFile, Selection

from pMolecule import NBModelORCA, QCModelBDF, System

from pMoleculeScripts import ConjugateGradientMinimize_SystemGeometry,

FIREMinimize_SystemGeometry ,

LBFGSMinimize_SystemGeometry ,

SteepestDescentMinimize_SystemGeometry

# 定義結(jié)構(gòu)優(yōu)化接口

def opt_ConjugateGradientMinimize(molecule, selection):

molecule.DefineFixedAtoms(selection) #固定原子

#定義優(yōu)化方法

ConjugateGradientMinimize_SystemGeometry(

molecule,

maximumIterations = 40, # 最大優(yōu)化步數(shù)

rmsGradientTolerance = 0.1, #優(yōu)化收斂控制

trajectories = [(trajectory, 1)]

) # 定義軌跡保存頻率

# 定義能量計(jì)算模式

nbModel = NBModelORCA()

qcModel = QCModelBDF("GB3LYP:6-31g")

# 讀取體系坐標(biāo)和拓?fù)湫畔?/p>

molecule = AmberTopologyFile_ToSystem ("GallicAcid.prmtop")

molecule.coordinates3 = AmberCrdFile_ToCoordinates3("GallicAcid.crd")

# 關(guān)閉體系對(duì)稱性

molecule.DefineSymmetry(crystalClass = None) #QM/MM方法不支持使用周期性邊界條件

#. Define Atoms List

natoms = len(molecule.atoms) # 系統(tǒng)中總原子數(shù)

qm_list = range(72, 90) # QM 區(qū)原子

activate_list = range(126, 144) + range (144, 162) # MM區(qū)活性原子(優(yōu)化中可以移動(dòng))

#定義MM區(qū)原子

mm_list = range (natoms)

for i in qm_list:

mm_list.remove(i) # MM 刪除QM原子

mm_inactivate_list = mm_list[:]

for i in activate_list :

mm_inactivate_list.remove(i)

# 輸入QM原子

qmmmtest_qc = Selection.FromIterable(qm_list)

# 定義各選擇區(qū)

selection_qm_mm_inactivate = Selection.FromIterable(qm_list + mm_inactivate_list)

selection_mm = Selection.FromIterable(mm_list)

selection_mm_inactivate = Selection.FromIterable(mm_inactivate_list)

# . Define the energy model.

molecule.DefineQCModel(qcModel, qcSelection = qmmmtest_qc)

molecule.DefineNBModel(nbModel)

molecule.Summary()

#計(jì)算優(yōu)化開始時(shí)總能量

eStart = molecule.Energy()

#定義輸出文件目錄名

outlabel = 'opt_watbox_bdf'

if os.path.exists(outlabel):

pass

else:

os.mkdir (outlabel)

outlabel = outlabel + '/' + outlabel

# 定義輸出軌跡

trajectory = SystemGeometryTrajectory (outlabel + ".trj" , molecule, mode = "w")

# 開始第一階段優(yōu)化

# 定義優(yōu)化兩步

iterations = 2

# 順次固定QM區(qū)和MM區(qū)進(jìn)行優(yōu)化

for i in range(iterations):

opt_ConjugateGradientMinimize(molecule, selection_qm_mm_inactivate) #固定QM區(qū)優(yōu)化

opt_ConjugateGradientMinimize(molecule, selection_mm) #固定MM區(qū)優(yōu)化

# 開始第二階段優(yōu)化

# QM區(qū)和MM區(qū)同時(shí)優(yōu)化

opt_ConjugateGradientMinimize(molecule, selection_mm_inactivate)

#輸出優(yōu)化后總能量

eStop = molecule.Energy()

#保存優(yōu)化坐標(biāo),可以為xyz/crd/pdb等。

XYZFile_FromSystem(outlabel + ".xyz", molecule)

AmberCrdFile_FromSystem(outlabel + ".crd" , molecule)

PDBFile_FromSystem(outlabel + ".pdb" , molecule)

# TDDFT計(jì)算

qcModel = QCModelBDF_template ( )

qcModel.UseTemplate (template = 'head_bdf_nosymm.inp' )

tdtest = Selection.FromIterable ( qm_list + activate_list )

# . Define the energy model.

molecule.DefineQCModel ( qcModel, qcSelection = tdtest )

molecule.DefineNBModel ( nbModel )

molecule.Summary ( )

# . Calculate

energy = molecule.Energy ( )

輸出體系總能量信息如下:

9fdb3d0e-080b-11ed-ba43-dac502259ad0.png

同時(shí)生成.log結(jié)果文件,和普通的激發(fā)態(tài)計(jì)算一樣,可以看到振子強(qiáng)度,激發(fā)能,激發(fā)態(tài)的總能量等信息

No. 1 w= 4.7116 eV -1937.8276358207 a.u. f= 0.0217 D= 0.0000 Ova= 0.6704

CV(0): A( 129 )-> A( 135 ) c_i: 0.7254 Per: 52.6% IPA: 7.721 eV Oai: 0.6606

CV(0): A( 129 )-> A( 138 ) c_i: 0.2292 Per: 5.3% IPA: 9.104 eV Oai: 0.8139

CV(0): A( 132 )-> A( 135 ) c_i: 0.4722 Per: 22.3% IPA: 7.562 eV Oai: 0.6924

CV(0): A( 132 )-> A( 138 ) c_i: -0.4062 Per: 16.5% IPA: 8.946 eV Oai: 0.6542

隨后還打印了躍遷偶極矩

*** Ground to excited state Transition electric dipole moments (Au) ***

State X Y Z Osc.

1 0.0959 0.1531 0.3937 0.0217 0.0217

2 0.0632 -0.1286 0.3984 0.0207 0.0207

3 -0.0797 -0.2409 0.4272 0.0287 0.0287

4 0.0384 -0.0172 -0.0189 0.0003 0.0003

5 1.1981 0.8618 -0.1305 0.2751 0.2751

吸收光譜分析

對(duì)于激發(fā)態(tài)我們往往需要得到理論預(yù)測(cè)的吸收譜峰形,也就是將每個(gè)激發(fā)態(tài)的吸收按一定的半峰寬進(jìn)行高斯展寬。在TDDFT計(jì)算正常結(jié)束后,我們需要進(jìn)入終端用命令調(diào)用BDF安裝路徑下的plotspec.py腳本執(zhí)行計(jì)算。若用戶使用鴻之微云算力資源,進(jìn)入命令端方式請(qǐng)查閱鴻之微云指南,此文不做贅述。

進(jìn)入終端后,在目錄下運(yùn)行$BDFHOME/sbin/plotspec.py bdf.out,會(huì)產(chǎn)生兩個(gè)文件,分別為bdf.stick.csv和bdf.spec.csv,前者包含所有激發(fā)態(tài)的吸收波長(zhǎng)和摩爾消光系數(shù),可以用來作棒狀圖,后者包含高斯展寬后的吸收譜(默認(rèn)的展寬FWHM為0.5 eV),分別對(duì)比真空環(huán)境以及溶劑化效應(yīng)下高斯展寬后的吸收譜情況,并用Excel、Origin等作圖軟件作圖如下:

9ffc7adc-080b-11ed-ba43-dac502259ad0.png

上圖也可說明由于QM/MM計(jì)算考慮溶劑化效應(yīng),存在周圍其他分子的相互作用,從而使得吸收光譜發(fā)生紅移現(xiàn)象。
審核編輯 :李倩


聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 光譜分析
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    9994
  • python
    +關(guān)注

    關(guān)注

    54

    文章

    4759

    瀏覽量

    84306

原文標(biāo)題:鴻之微BDF軟件計(jì)算賞析|采用BDF的QM/MM多尺度計(jì)算方法研究晶體的光物理性質(zhì)(二)

文章出處:【微信號(hào):hzwtech,微信公眾號(hào):鴻之微】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    利用Python腳本登錄到交換機(jī)并創(chuàng)建VLAN

    本文將詳細(xì)介紹如何利用Python腳本登錄到交換機(jī)并創(chuàng)建VLAN。
    的頭像 發(fā)表于 08-12 17:59 ?450次閱讀

    使用Python腳本備份華為交換機(jī)的配置信息

    在現(xiàn)代網(wǎng)絡(luò)管理中,備份交換機(jī)的配置信息是一項(xiàng)至關(guān)重要的任務(wù)。備份可以確保在交換機(jī)發(fā)生故障或配置錯(cuò)誤時(shí),能夠迅速恢復(fù)到之前的工作狀態(tài)。本文將詳細(xì)介紹如何使用Python腳本備份華為交換機(jī)的配置信息。
    的頭像 發(fā)表于 08-12 17:50 ?431次閱讀
    使用<b class='flag-5'>Python</b><b class='flag-5'>腳本</b>備份華為交換機(jī)的配置信息

    Python建模算法與應(yīng)用

    Python作為一種功能強(qiáng)大、免費(fèi)、開源且面向?qū)ο蟮木幊陶Z言,在科學(xué)計(jì)算、數(shù)學(xué)建模、數(shù)據(jù)分析等領(lǐng)域展現(xiàn)出了卓越的性能。其簡(jiǎn)潔的語法、對(duì)動(dòng)態(tài)輸入的支持以及解釋性語言的本質(zhì),使得Python在多個(gè)平臺(tái)
    的頭像 發(fā)表于 07-24 10:41 ?374次閱讀

    用離線安裝器安裝的idf,其創(chuàng)建的Python虛擬環(huán)境無激活腳本是怎么回事?

    如題,用離線安裝器安裝的idf,其創(chuàng)建的Python虛擬環(huán)境無激活腳本,具體如下圖所示: 反而用vscode插件安裝的idf有,如下圖:vscode插件安裝的idf的Python虛擬環(huán)境 提問:沒有
    發(fā)表于 06-11 06:49

    如何優(yōu)化HLS仿真腳本運(yùn)行時(shí)間

    需求:由于自己目前一個(gè) HLS 仿真腳本需要運(yùn)行 1個(gè)多小時(shí),先打算通過打印時(shí)間戳的方式找出最耗時(shí)的部分,然后想辦法優(yōu)化。
    的頭像 發(fā)表于 02-23 09:29 ?592次閱讀

    通過Python腳本實(shí)現(xiàn)WIFI密碼的自動(dòng)猜解

    本文將記錄學(xué)習(xí)下如何通過 Python 腳本實(shí)現(xiàn) WIFI 密碼的自動(dòng)猜解。
    的頭像 發(fā)表于 01-25 10:46 ?3106次閱讀
    通過<b class='flag-5'>Python</b><b class='flag-5'>腳本</b>實(shí)現(xiàn)WIFI密碼的自動(dòng)猜解

    如何使用Python編寫腳本來自動(dòng)發(fā)送郵件

    Python是一種非常流行的編程語言,可以用于多種用途,包括自動(dòng)化任務(wù)。其中一個(gè)常見的自動(dòng)化任務(wù)是自動(dòng)發(fā)送郵件。在本文中,我們將介紹如何使用Python編寫腳本來自動(dòng)發(fā)送郵件。 要使用Pyth
    的頭像 發(fā)表于 12-07 11:36 ?1227次閱讀

    python軟件怎么運(yùn)行代碼

    Python是一種高級(jí)編程語言,它被廣泛用于開發(fā)各種類型的應(yīng)用程序,從簡(jiǎn)單的腳本到復(fù)雜的網(wǎng)絡(luò)應(yīng)用和機(jī)器學(xué)習(xí)模型。要運(yùn)行Python代碼,您需要一個(gè)Python解釋器,它可以將您的代碼翻
    的頭像 發(fā)表于 11-28 16:02 ?823次閱讀

    【ELF 1開發(fā)板試用】+ python腳本編程

    python腳本來進(jìn)行使用。 其使用方法是: 1)vi編輯器編寫一個(gè)腳本文件,其內(nèi)容如圖5所示。 圖5 編寫腳本文件 2)為執(zhí)行腳本文件,執(zhí)
    發(fā)表于 11-28 10:24

    python怎樣運(yùn)行代碼

    Python是一種廣泛使用的編程語言,用于開發(fā)各種類型的應(yīng)用程序。它具有簡(jiǎn)單易學(xué)的語法和強(qiáng)大的功能,可以用于編寫簡(jiǎn)單的腳本、開發(fā)桌面應(yīng)用、構(gòu)建Web應(yīng)用、進(jìn)行科學(xué)計(jì)算等多種用途。在本文中,我們將詳細(xì)
    的頭像 發(fā)表于 11-22 10:31 ?1093次閱讀

    Python 制作按鍵觸發(fā)Windows通知的腳本

    ,擴(kuò)展成任意一個(gè)按鍵被觸發(fā)或切換都進(jìn)行 windows 通知的腳本: 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成功安裝
    的頭像 發(fā)表于 11-01 16:09 ?556次閱讀
    <b class='flag-5'>Python</b> 制作按鍵觸發(fā)Windows通知的<b class='flag-5'>腳本</b>

    使用Rust優(yōu)化Python性能

    在數(shù)據(jù)分析領(lǐng)域Python無疑是最流行的編程語言,但是Python有一個(gè)硬傷就是作為一個(gè)編譯語言在性能上有些微的欠缺。而同樣最流行的語言Rust則在性能方面表現(xiàn)優(yōu)秀。本文我們一起學(xué)習(xí)一個(gè)優(yōu)化項(xiàng)目的實(shí)踐,對(duì)一個(gè)數(shù)據(jù)分析程序,改為R
    的頭像 發(fā)表于 11-01 15:59 ?801次閱讀
    使用Rust<b class='flag-5'>優(yōu)化</b><b class='flag-5'>Python</b>性能

    Python超簡(jiǎn)單制作Windows按鍵通知腳本

    ,擴(kuò)展成任意一個(gè)按鍵被觸發(fā)或切換都進(jìn)行 windows 通知的腳本: 1.準(zhǔn)備 1.準(zhǔn)備 開始之前,你要確保Python和pip已經(jīng)成
    的頭像 發(fā)表于 11-01 09:24 ?403次閱讀
    <b class='flag-5'>Python</b>超簡(jiǎn)單制作Windows按鍵通知<b class='flag-5'>腳本</b>

    怎么用Python構(gòu)建一個(gè)自動(dòng)發(fā)送郵件的腳本

    呢? 類似的應(yīng)用場(chǎng)景還有很多,不僅僅是在股票策略提醒上,比如定時(shí)向某些人發(fā)送郵件;網(wǎng)站宕機(jī)了,實(shí)時(shí)發(fā)送郵件提醒;網(wǎng)站負(fù)載過高,發(fā)送郵件提醒......等等。 下面就來講講怎么用Python構(gòu)建一個(gè)自動(dòng)發(fā)送郵件的腳本。 1.開啟
    的頭像 發(fā)表于 10-31 16:36 ?500次閱讀
    怎么用<b class='flag-5'>Python</b>構(gòu)建一個(gè)自動(dòng)發(fā)送郵件的<b class='flag-5'>腳本</b>

    Aardio的基本用法及調(diào)用 Python 腳本的具體流程

    1. 前言 我們都知道 Python 可以用來開發(fā)桌面應(yīng)用,一旦功能開發(fā)完成,最后打包的可執(zhí)行文件體積大,并且使用 Python 開發(fā)桌面應(yīng)用周期相對(duì)較長(zhǎng) 假如想快速開發(fā)一款 PC 端的桌面
    的頭像 發(fā)表于 10-31 10:30 ?5932次閱讀
    Aardio的基本用法及調(diào)用 <b class='flag-5'>Python</b> <b class='flag-5'>腳本</b>的具體流程