Вычисление параметров для молекулярной механики

Необходимые сведения о работе с ORCA http://kodomo.fbb.msu.ru/~golovin/pdf/OrcaManual_2_9.pdf или https://sites.google.com/site/orcainputlibrary/home

Суть задания состоит в определении констант ковалентных взаимодействий для молекулярной механики на основе квантово-химических расчётов. Пример подобной работы представлен в http://ambermd.org/antechamber/gaff.pdf это статье о разработке поля gaff.

  • Вам предоставлена оптимизированная структура этана в виде z-matrix :
inp = '''!HF RHF 6-31G
* int 0 1
C 0 0 0 0 0 0 
C 1 0 0 1.52986 0 0 
H 1 2 0 1.08439 111.200 0
H 1 2 3 1.08439 111.200 120
H 1 2 3 1.08439 111.200 -120
H 2 1 3 1.08439 111.200 180
H 2 1 5 1.08439 111.200 120
H 2 1 5 1.08439 111.200 -120
*
'''

Как вы видите, вместо значений длин и углов связей можно вставить значение. Наша цель состоит в том, что бы рассчитать 20 разных длинн связи с шагом 0.02 ангстрема для расчёта энергии в ORCA с разными значениями по длине '''одной''' из связей (C-C).

  • Конечно можно сделать эти файлы вручную, но ожидается, что вы сделаете это средствами '''python''' .
  • Предлагаю следующую функцию по запуску ORCA
def run_orca(inp):
    with open('orca.inp', 'w') as outfile:
        outfile.write(inp)
    p = subprocess.Popen("/home/shad/progs/bin/orca orca.inp", 
                          shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    out=p.communicate()[0]
    out.splitlines()

    # extract energy: FINAL SINGLE POINT ENERGY'
    # and return it as float

    return ....
  • У вас есть зависимость энергии молекулы от длины одной связи. Эту зависимость можно построить в Excel (...). Вам предлагается сделать это в matplotlib в Jupyter Notebook.

Для matplotlib:

%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize 
# fake x array , replace with real one
x_o=np.arange(1,2,0.1)
# fake y array, replace with energies
y_o=-70+2*(x_o -1.58)**2 

#function is  f(x)=k(b-x)^2 + a
fitfunc = lambda p, x: p[0]*pow(p[1]-x,2) + p[2] # Target function
errfunc = lambda p, x, y: fitfunc(p, x) - y # Error function

p0 = [1,1, -79] # Initial guess for the parameters
p1, success = optimize.leastsq(errfunc, p0[:], args=(x_o, y_o))
print "Optimized params:", p1

#Plot it
plt.plot(x_o, y_o, "ro", x_o,fitfunc(p1,x_o),"r-",c='blue',alpha=0.5)
plt.xlim(1,2)
plt.show()
  • Проделайте аналогичные операции для валентного угла HCС, его значения должны изменяться от 109.2 до 113.2. Сохраните полученные коэффициенты в отчёт. Примечание: не перезаписывайте файл со значениями энергий они Вам нужны для отчёта. Сравните полученные константы с данными из статьи о GAFF. Укажите возможные причины расхождений ваших результатов и публикацией.
  • Проделайте аналогичные операции для торсионного угла CC, его значения должны изменяться от -180 до 180 c шагом 12. Сохраните изображение и укажите в отчёте количество минимумов функции.
  • Увеличьте шаг до 0.1 ангстрема при расчёте связи. Постройте зависимость. Укажите какой функцией можно было бы аппроксимировать наблюдаемую зависимость.