Source code for openmicron.forcefield.functionterms.umbrella_sampling

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

[docs] def umbrella_sampling_contact(cv_info,kums,q0,beta=50,lamda=1.2,force_group=12): """ Implementing umbrella sampling for contacts Parameters ---------- cv_info: pd.DataFrame The information for the contacts is expressed in a table format of N rows, where N represents the number of contacts. Each row consists of three columns: index (a1, a2), and the corresponding rest length (sigma) for each contact. kums: float The spring constant q0: float The center of each harmonic biasing potential. The values of q0 cover the range from 0 to 1. beta: float The smoothing parameter that default value is 50 and unit is nm. lamda: float The scale parameter of rest length. default value is 1.2. force_group: int Force group. Return ------ ums_contact: openmm force """ num_contact = cv_info.shape[0] cv_atom_idx_set = list(np.unique(cv_info[['a1','a2']].to_numpy().flatten())) for i,row in cv_info.iterrows(): a1 = row.a1 a2 = row.a2 sigma = row.sigma a1_idx = cv_atom_idx_set.index(a1)+ 1 a2_idx = cv_atom_idx_set.index(a2) + 1 if i == 0: i_cv_dis = f'r{i}=distance(p{a1_idx},p{a2_idx});' i_cv_disrange = f"""rrange{i}=step(1+{lamda*sigma}-r{i});""" i_cv_ddis = f"""dr{i}=rrange{i}*(r{i}-{lamda*sigma});""" i_cv_qi = f"""contact{i}=rrange{i}/(1+exp({beta}*dr{i}));"""#step(1-r{a1_idx}{a2_idx}+{lambdar*h_cut}) contact = f"""0.5*kums*(q-q0)^2;q={1/num_contact}*(contact{i}""" #{1/num_inter_contact_idx};0.5*kums*(q-q0)^2 else: i_cv_dis += f'r{i}=distance(p{a1_idx},p{a2_idx});' i_cv_disrange += f"""rrange{i}=step(1+{lamda*sigma}-r{i});""" i_cv_ddis += f"""dr{i}=rrange{i}*(r{i}-{lamda*sigma});""" i_cv_qi += f"""contact{i}=rrange{i}/(1+exp({beta}*dr{i}));"""#step(1-r{a1_idx}{a2_idx}+{lambdar*h_cut}) contact += f"""+contact{i}""" contact_function = contact +');' +i_cv_qi + i_cv_ddis + i_cv_disrange + i_cv_dis ums_contact = mm.CustomCompoundBondForce(len(cv_atom_idx_set),contact_function) #ums_contact.addGlobalParameter('kums',kums) ums_contact.addPerBondParameter('kums') ums_contact.addPerBondParameter('q0') ums_contact.addBond(cv_atom_idx_set,[kums,q0]) ums_contact.setForceGroup(force_group) return ums_contact