예제 #1
0
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)
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
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
예제 #5
0
 def __init__(self,arcname):
    """Reads in Tinker trajectory arcname."""
    self.traj = md.load_arc(arcname)
예제 #6
0
 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