def find_rotation_rest(fxyz, ligidx0, atomnames='CA', rcutoff=0.6, alpha=1.0, rest_rotbond=False, rotbond_only=False): try: t = md.load_arc(fxyz) except IOError: t = md.load(fxyz) if rest_rotbond: get_rottors(t, ligidx0) if rotbond_only: return nbr = get_tab_branch(t.topology) ligidx = np.array(sorted(list(set(ligidx0) - set(t.topology.select('name H'))))) if len(ligidx) == 0: error_exit("No ligand heavy atoms found") protidx0 = t.topology.select('name %s'%(atomnames)) protidx0 = np.array(sorted(set(protidx0) - set(ligidx))) if len(protidx0) == 0: error_exit("No ligand atoms within %.3f nm of protein %s atoms"%(rcutoff, atomnames)) int_idxs, r0s = get_idx_pocket(t, protidx0, ligidx) RAD_IN_DEG = 180/np.pi k0s = np.zeros_like(r0s) + 10.0/(RAD_IN_DEG)**2.0 k0s[0] = 10.0 print(write_rest(int_idxs, r0s, k0s)) RT = 8.314 * 298 / 4184 # https://doi.org/10.1021/jp0217839 # Eq. (14) assert len(k0s) == 6 dgrest = RT*np.log(1662*8*np.pi**2.0*np.sqrt(np.prod(k0s)*RAD_IN_DEG**10.0) \ /(r0s[0]**2.0*np.sin(r0s[1]/RAD_IN_DEG)*np.sin(r0s[2]/RAD_IN_DEG)*(2*np.pi*RT)**3)) print("#dGrest(kcal/mol) %.5f"%dgrest)
def find_rotation_rest(annihilator, fxyz, ligidx0, atomnames='CA', rcutoff=0.6, alpha=1.0, rest_rotbond=False, rotbond_only=False): try: t = md.load_arc(fxyz) except IOError: t = md.load(fxyz) if rest_rotbond: get_rottors(t, ligidx0) if rotbond_only: return nbr = get_tab_branch(t.topology) ligidx = np.array( sorted(list(set(ligidx0) - set(t.topology.select('name H'))))) if len(ligidx) == 0: error_exit("No ligand heavy atoms found") protidx0 = t.topology.select('name %s' % (atomnames)) protidx0 = np.array(sorted(set(protidx0) - set(ligidx))) if len(protidx0) == 0: error_exit("No ligand atoms within %.3f nm of protein %s atoms" % (rcutoff, atomnames)) annihilator.int_idxs = get_idx_pocket(t, protidx0, ligidx) r0s = [calc_coord(t, _)[-1] for _ in annihilator.int_idxs] # last frame RAD_IN_DEG = 180 / np.pi k0s = np.zeros_like(r0s) + annihilator.anglerestraintconstant k0s[0] = annihilator.distancerestraintconstant restraintstrings = write_rest(annihilator.int_idxs, r0s, k0s) keymods.RemoveKeyWord(annihilator, annihilator.configkeyfilename, 'restrain') for string in restraintstrings: keymods.AddKeyWord(annihilator, annihilator.configkeyfilename, string + '\n') RT = 8.314 * 298 / 4184 # https://doi.org/10.1021/jp0217839 # Eq. (14) assert len(k0s) == 6 dgrest = -RT * np.log( 1662 * 8 * np.pi**2.0 * np.sqrt(np.prod(k0s) * RAD_IN_DEG**10.0) / (r0s[0]**2.0 * np.sin(r0s[1] / RAD_IN_DEG) * np.sin(r0s[2] / RAD_IN_DEG) * (2 * np.pi * RT)**3)) annihilator.rescorrection = dgrest
def AverageCOMGroups(annihilator, filename): annihilator.WriteToLog('Averaging COM groups from ' + filename, prin=True) try: t = md.load_arc(filename) except IOError: t = md.load(filename) g1COMtog2COMdistarray = [] g1atomidxtovecdic = {} g1atomidxtomassdic = {} g2atomidxtovecdic = {} g2atomidxtomassdic = {} for framecount in range(t.n_frames): for a in t.topology.atoms: zeroindex = a.index atomidx = zeroindex + 1 atomsymb = a.element.symbol mass = annihilator.elementsymtomass[atomsymb] vec = t.xyz[framecount, zeroindex, :] if atomidx in annihilator.restrainatomgroup1: g1atomidxtovecdic[atomidx] = vec g1atomidxtomassdic[atomidx] = mass elif atomidx in annihilator.restrainatomgroup2: g2atomidxtovecdic[atomidx] = vec g2atomidxtomassdic[atomidx] = mass if len(g1atomidxtovecdic.keys()) == len( annihilator.restrainatomgroup1) and len( g2atomidxtovecdic.keys()) == len( annihilator.restrainatomgroup2): g1COM = ComputeCOM(annihilator, g1atomidxtovecdic, g1atomidxtomassdic) g2COM = ComputeCOM(annihilator, g2atomidxtovecdic, g2atomidxtomassdic) dispx = g1COM[0] - g2COM[0] dispx = ShiftDisplacementByPBC(annihilator, dispx) dispy = g1COM[1] - g2COM[1] dispy = ShiftDisplacementByPBC(annihilator, dispy) dispz = g1COM[2] - g2COM[2] dispz = ShiftDisplacementByPBC(annihilator, dispz) dist = np.sqrt(dispx**2 + dispy**2 + dispz**2) g1COMtog2COMdistarray.append(dist) atomidxtovecdic = {} atomidxtomassdic = {} return round(np.mean(g1COMtog2COMdistarray), 2)
def find_grp_idx(fxyz, ligidx0, atomnames='CA', rcutoff=1.2, alpha=1.0): try: t = md.load_arc(fxyz) except IOError: t = md.load(fxyz) ligidx = np.array(sorted(list(set(ligidx0) - set(t.topology.select('name H'))))) if len(ligidx) == 0: error_exit("No ligand heavy atoms found") protidx0 = t.topology.select('name %s'%(atomnames)) protidx0 = np.array(sorted(set(protidx0) - set(ligidx))) distmat = distance_matrix(t.xyz[0, ligidx, :], t.xyz[0, protidx0, :]) distpro = np.min(distmat, axis=0) protidx = protidx0[distpro <= rcutoff] if len(protidx) == 0: return imindist = np.argmin(distmat) iminlig = ligidx[imindist // len(protidx0)] com_lig = np.mean(t.xyz[0, list(ligidx), :], axis=0) com_lig = t.xyz[0, [iminlig], :] wts0 = np.ones(len(protidx)) xyz_prot = t.xyz[0, protidx, :] xyz1_prot = xyz_prot - com_lig.reshape((1, -1)) res = scipy.optimize.minimize(target_disp, wts0, args=(xyz1_prot, alpha)) wts1 = np.array(res.x) wts1 = np.maximum(0, wts1) wts1 *= 1.0/np.sum(wts1) wtm = np.mean(wts1[wts1 > 0]) mask1 = wts1 > 0.4*wtm #print(wts1) #print(np.mean(wts1)) #print(mask1) com_p1 = (np.mean(t.xyz[0, protidx[mask1], :], axis=0)).reshape((1, -1)) xyz_lig = t.xyz[0, ligidx, :] dists = np.linalg.norm(xyz_lig - com_p1, axis=1) #print('DIST', dists) imin = np.argmin(dists) dcom = np.linalg.norm(com_lig - com_p1) dmin = np.linalg.norm(xyz_lig[imin] - com_p1) idx_tinker = write_tinker_idx([_+1 for _ in protidx[mask1]]) #print('#', (' '.join(['%5d'%(_) for _ in protidx[mask1]]))) outp = '' sgrp = '' for n in idx_tinker: sgrp += ' %5d'%n if len(sgrp) > 50 and n > 0: #print('group 1 %s'%sgrp) outp += ('group 1 %s\n'%sgrp) sgrp = '' outp += ('group 2 %s\n'%(' '.join(['%5d'%(_) for _ in [ligidx[imin] + 1]]))) outp += ("#r_0=%.3f"%(dmin*10)) #print('group 2 %s'%(' '.join(['%5d'%(_) for _ in [ligidx[imin] + 1]]))) #print("#r_0=%.3f"%(dmin*10)) return dmin*10, outp
def __init__(self,arcname): """Reads in Tinker trajectory arcname.""" self.traj = md.load_arc(arcname)
def __init__(self,uindname): """Reads in Tinker uind file uindname.""" self.traj = md.load_arc(uindname) # Convert units - mdtraj reads in as distance in nm! self.traj.xyz = self.traj.xyz *10