Source code for openmicron.forcefield.functionterms.dihedral_terms

import pandas as pd
import openmm as mm
from openmm import unit
import numpy as np


[docs] def native_dihd_term(nat_dihd_info,use_pbc=False,force_group=1): """ ordinary dihedral angle potential. Parameters ---------- nat_dihd_info : pd.DataFrame Information for all native dihedral. use_pbc : bool, optional Whether use periodic boundary conditions. If False (default),then pbc would not apply to force. force_group : int Force group. """ # create a custom Tortion force nat_tortion_force = mm.CustomTorsionForce("k_dih1*(1 - cos(dth)) + k_dih3*(1 - cos(3*dth));dth=theta-theta0") nat_tortion_force.addPerTorsionParameter("k_dih1") nat_tortion_force.addPerTorsionParameter("theta0") nat_tortion_force.addPerTorsionParameter("k_dih3") for row in nat_dihd_info.itertuples(): nat_tortion_force.addTorsion(row.a1, row.a2, row.a3, row.a4, [row.k_dihd1,row.natdihd,row.k_dihd3]) nat_tortion_force.setUsesPeriodicBoundaryConditions(use_pbc) nat_tortion_force.setForceGroup(force_group) return nat_tortion_force
[docs] def aicg_dihd_term(aicg_dihd_info,use_pbc=False,force_group=1): """ A structure-based local contact potential to describe the chirality of local interactions (dihedral angle of backbone) and reference from "Li, W., Wang, W., & Takada, S. (2014). Energy landscape views for interplays among folding, binding, and allostery of calmodulin domains. Proceedings of the National Academy of Sciences, 111(29), 10550-10555". Parameters ---------- aicg_dihd_info : pd.DataFrame Information for all aicg dihedral angle use_pbc : bool, optional Whether use periodic boundary conditions. If False (default),then pbc would not apply to force. force_group : int Force group. Return ------ aicg_dihd_force : Force OpenMM Force object """ energy_function = f'''-epsilon*exp(gex); gex=-dt_periodic^2/(2*width^2); dt_periodic = dt-floor((dt+{np.pi})/(2*{np.pi}))*(2*{np.pi}); dt=theta - theta0 ''' aicg_dihd_force = mm.CustomTorsionForce(energy_function) aicg_dihd_force.addPerTorsionParameter("epsilon") aicg_dihd_force.addPerTorsionParameter("theta0") aicg_dihd_force.addPerTorsionParameter("width") for row in aicg_dihd_info.itertuples(): aicg_dihd_force.addTorsion(row.a1, row.a2, row.a3, row.a4, [row.epsilon, row.natdihd, row.width]) aicg_dihd_force.setUsesPeriodicBoundaryConditions(use_pbc) aicg_dihd_force.setForceGroup(force_group) return aicg_dihd_force
[docs] def flex_dihd_term(flex_dihd_info,use_pbc=False,force_group=1): """a sequence dependence flexible local dihedral interaction flex_dihd_info : pd.DataFrame Information for all aicg dihedral angle Parameters ---------- flex_dihd_info : pd.DataFrame Information for all flexible local dihedral angle use_pbc : bool, optional Whether use periodic boundary conditions. If False (default),then pbc would not apply to force. force_group : int Force group. Return ------ flex_dihd_force : Force OpenMM Force object """ flex_dihd_force = mm.CustomTorsionForce("C+c1*cos(theta)+s1*sin(theta)+ \ c2*cos(2*theta)+s2*sin(2*theta)+\ c3*cos(3*theta)+s3*sin(3*theta)-fdih_ener_corr") flex_dihd_force.addPerTorsionParameter("C") flex_dihd_force.addPerTorsionParameter("c1") flex_dihd_force.addPerTorsionParameter("s1") flex_dihd_force.addPerTorsionParameter("c2") flex_dihd_force.addPerTorsionParameter("s2") flex_dihd_force.addPerTorsionParameter("c3") flex_dihd_force.addPerTorsionParameter("s3") flex_dihd_force.addPerTorsionParameter("fdih_ener_corr") for _,row in flex_dihd_info.iterrows(): a1 = row['a1'] a2 = row['a2'] a3 = row['a3'] a4 = row['a4'] para = row[4:] flex_dihd_force.addTorsion(a1,a2,a3,a4,para) flex_dihd_force.setUsesPeriodicBoundaryConditions(use_pbc) flex_dihd_force.setForceGroup(force_group) return flex_dihd_force