Пример #1
0
def get_rmsd(initparas):

    global idxs, mcresids2, atompairs

    #Modify the C4 terms in the prmtop file
    for i in range(0, len(idxs)):
        prmtop.parm_data['LENNARD_JONES_CCOEF'][idxs[i]] = initparas[i]

    #Overwrite the prmtop file
    prmtop.write_parm('OptC4.top')

    #Perform the OpenMM optimization
    #Use AmberParm function to transfer the topology and
    #coordinate file to the object OpenMM can use
    Ambermol = AmberParm('OptC4.top', options.cfile)

    # Create the OpenMM system
    print('Creating OpenMM System')
    if options.simupha == 'gas':
        system = Ambermol.createSystem(nonbondedMethod=app.NoCutoff)
    elif options.simupha == 'liquid':
        system = Ambermol.createSystem(nonbondedMethod=app.PME,
                                       nonbondedCutoff=8.0*u.angstroms,
                                       constraints=app.HBonds,)

    #Add restraints
    force = mm.CustomExternalForce("k*((x-x0)^2+(y-y0)^2+(z-z0)^2)")
    force.addGlobalParameter("k", 200.0)
    force.addPerParticleParameter("x0")
    force.addPerParticleParameter("y0")
    force.addPerParticleParameter("z0")
    #for i in range(0, len(Ambermol.atoms)):
    for i, atom_crd in enumerate(Ambermol.positions):
        #if (Ambermol.atoms[i].residue.number+1 not in mcresids2) and \
        if (i+1 not in mcresids2) and \
          (Ambermol.atoms[i].residue.name not in ['WAT', 'HOH']) and \
          (Ambermol.atoms[i].name in ['CA', 'C', 'N']):
            force.addParticle(i, atom_crd.value_in_unit(u.nanometers))
    system.addForce(force)

    # Create the integrator to do Langevin dynamics
    # Temperature of heat bath, Friction coefficient, Time step
    integrator = mm.LangevinIntegrator(300*u.kelvin, 1.0/u.picoseconds,
                                       1.0*u.femtoseconds,)

    # Define the platform to use; CUDA, OpenCL, CPU, or Reference. Or do not
    # specify the platform to use the default (fastest) platform
    # Create the Simulation object
    if options.platf == 'ref':
        platform = mm.Platform.getPlatformByName('Reference')
        sim = app.Simulation(Ambermol.topology, system, integrator, platform)
    elif options.platf == 'cpu':
        platform = mm.Platform.getPlatformByName('CPU')
        sim = app.Simulation(Ambermol.topology, system, integrator, platform)
    elif options.platf == 'cuda':
        platform = mm.Platform.getPlatformByName('CUDA')
        prop = dict(CudaPrecision='mixed')
        sim = app.Simulation(Ambermol.topology, system, integrator, platform,
                             prop)
    elif options.platf == 'opencl':
        platform = mm.Platform.getPlatformByName('OpenCL')
        prop = dict(CudaPrecision='mixed')
        sim = app.Simulation(Ambermol.topology, system, integrator, platform,
                             prop)

    # Set the particle positions
    sim.context.setPositions(Ambermol.positions)

    # Output the rst file
    restrt = RestartReporter(options.rfile, 100, write_velocities=False)
    sim.reporters.append(restrt)

    # Minimize the energy
    print('Minimizing energy ' + str(options.maxsteps) + ' steps.')
    sim.minimizeEnergy(maxIterations=options.maxsteps)

    # Overwrite the final file
    state = sim.context.getState(getPositions=True, enforcePeriodicBox=True)
    restrt.report(sim, state)

    val_aft_min = []
    crds_aft_min = read_rstf(options.rfile)
    for i in atompairs:
        if len(i) == 2:
            crd1 = crds_aft_min[i[0]-1]
            crd2 = crds_aft_min[i[1]-1]
            bond = calc_bond(crd1, crd2)
            val_aft_min.append(('bond', bond))
        elif len(i) == 3:
            crd1 = crds_aft_min[i[0]-1]
            crd2 = crds_aft_min[i[1]-1]
            crd3 = crds_aft_min[i[2]-1]
            angle = calc_angle(crd1, crd2, crd3)
            val_aft_min.append(('angle', angle))
        elif len(i) == 4:
            crd1 = crds_aft_min[i[0]-1]
            crd2 = crds_aft_min[i[1]-1]
            crd3 = crds_aft_min[i[2]-1]
            crd4 = crds_aft_min[i[3]-1]
            dih = calc_dih(crd1, crd2, crd3, crd4)
            val_aft_min.append(('dih', dih))

    valdiffs = []
    for i in range(0, len(atompairs)):
        if val_bf_min[i][0] == 'bond':
            valdiff = abs(val_aft_min[i][1] - val_bf_min[i][1]) * 1.0 / 100.0
        elif val_bf_min[i][0] == 'angle':
            valdiff = abs(val_aft_min[i][1] - val_bf_min[i][1]) * 1.0 / 2.0
        elif val_bf_min[i][0] == 'dih':
            valdiff = abs(val_aft_min[i][1] - val_bf_min[i][1])
            if (360.0 - valdiff < valdiff):
                valdiff = 360.0 - valdiff
        valdiffs.append(valdiff)

    fnldiff = numpy.sum(valdiffs)
    print(fnldiff)

    return fnldiff
Пример #2
0
        crd1 = crds_bf_min[i[0]-1]
        crd2 = crds_bf_min[i[1]-1]
        bond = calc_bond(crd1, crd2)
        val_bf_min.append(('bond', bond))
    elif len(i) == 3:
        crd1 = crds_bf_min[i[0]-1]
        crd2 = crds_bf_min[i[1]-1]
        crd3 = crds_bf_min[i[2]-1]
        angle = calc_angle(crd1, crd2, crd3)
        val_bf_min.append(('angle', angle))
    elif len(i) == 4:
        crd1 = crds_bf_min[i[0]-1]
        crd2 = crds_bf_min[i[1]-1]
        crd3 = crds_bf_min[i[2]-1]
        crd4 = crds_bf_min[i[3]-1]
        dih = calc_dih(crd1, crd2, crd3, crd4)
        val_bf_min.append(('dih', dih))

print("Bond, angle and dihedral before minimization...")
print(val_bf_min)

#-----------------------------------------------------------------------------#
#Get the Amber mask of the metal center complex and print it into ptraj.in file
#-----------------------------------------------------------------------------#

#Print the parmed input file, add new LJ types to the bonded atoms
maskns = []
for i in smcids:
    maskn = str(mol.atoms[i].resid) + '@' + mol.atoms[i].atname
    maskns.append(maskn)
Пример #3
0
def get_dih_fc_with_sem(crds, fcmatrix, nat1, nat2, nat3, nat4, n1, n2,
                        scalef):

    crd1 = crds[3 * nat1 - 3:3 * nat1]
    crd2 = crds[3 * nat2 - 3:3 * nat2]
    crd3 = crds[3 * nat3 - 3:3 * nat3]
    crd4 = crds[3 * nat4 - 3:3 * nat4]

    dihval = calc_dih(crd1, crd2, crd3, crd4)

    dis12 = calc_bond(crd1, crd2)  #unit is bohr
    dis23 = calc_bond(crd2, crd3)  #unit is bohr
    dis34 = calc_bond(crd3, crd4)  #unit is bohr

    #get the unit vector
    vec12 = array(crd2) - array(crd1)  #vec12 is vec2 - vec1
    vec21 = -vec12
    vec23 = array(crd3) - array(crd2)
    vec32 = -vec23
    vec34 = array(crd4) - array(crd3)
    vec43 = -vec34

    vec12 = array([i / dis12 for i in vec12])
    vec21 = array([i / dis12 for i in vec21])
    vec23 = array([i / dis23 for i in vec23])
    vec32 = array([i / dis23 for i in vec32])
    vec34 = array([i / dis34 for i in vec34])
    vec43 = array([i / dis34 for i in vec43])

    #get the normalized vector
    vecUNABCp = cross(vec32, vec12)
    vecUNABC = array([i / norm(vecUNABCp) for i in vecUNABCp])

    vecUNBCDp = cross(vec43, vec23)
    vecUNBCD = array([i / norm(vecUNBCDp) for i in vecUNBCDp])

    afcmatrix12 = array([[float(0) for x in range(3)] for x in range(3)])
    afcmatrix43 = array([[float(0) for x in range(3)] for x in range(3)])
    for i in range(0, 3):
        for j in range(0, 3):
            afcmatrix12[i][j] = -fcmatrix[3 * (nat1 - 1) + i][3 *
                                                              (nat2 - 1) + j]
    for i in range(0, 3):
        for j in range(0, 3):
            afcmatrix43[i][j] = -fcmatrix[3 * (nat4 - 1) + i][3 *
                                                              (nat3 - 1) + j]
    eigval12, eigvector12 = eig(afcmatrix12)
    eigval43, eigvector43 = eig(afcmatrix43)

    contri12 = 0.0
    contri34 = 0.0
    for i in range(0, 3):
        ev12 = eigvector12[:, i]
        ev43 = eigvector43[:, i]
        contri12 = contri12 + eigval12[i] * abs(dot(vecUNABC, ev12))
        contri34 = contri34 + eigval43[i] * abs(dot(vecUNBCD, ev43))

    contri12 = contri12 * (norm(cross(vec12, vec23))**2)
    contri34 = contri34 * (norm(cross(vec23, vec34))**2)
    contri12 = 1.0 / (contri12 * dis12 * dis12)
    contri34 = 1.0 / (contri34 * dis34 * dis34)

    fcfinal1 = (
        1.0 /
        (contri12 + contri34)) * H_TO_KCAL_MOL * 0.5  #/ (math.degrees(1.0)**2)

    fcfinal = fcfinal1 * (math.radians(
        180.0 / float(n2)))**2 / (float(n1) * float(n2))

    fcfinal = fcfinal * scalef * scalef

    return dihval, fcfinal1, fcfinal
Пример #4
0
def get_dih_fc_with_sem(crds, fcmatrix, nat1, nat2, nat3, nat4, n1, n2, scalef):

    crd1 = crds[3*nat1-3:3*nat1]
    crd2 = crds[3*nat2-3:3*nat2]
    crd3 = crds[3*nat3-3:3*nat3]
    crd4 = crds[3*nat4-3:3*nat4]

    dihval = calc_dih(crd1, crd2, crd3, crd4)

    dis12 = calc_bond(crd1, crd2) #unit is bohr
    dis23 = calc_bond(crd2, crd3) #unit is bohr
    dis34 = calc_bond(crd3, crd4) #unit is bohr

    #get the unit vector
    vec12 = array(crd2) - array(crd1) #vec12 is vec2 - vec1
    vec21 = - vec12
    vec23 = array(crd3) - array(crd2)
    vec32 = - vec23
    vec34 = array(crd4) - array(crd3)
    vec43 = - vec34

    vec12 = array([i/dis12 for i in vec12])
    vec21 = array([i/dis12 for i in vec21])
    vec23 = array([i/dis23 for i in vec23])
    vec32 = array([i/dis23 for i in vec32])
    vec34 = array([i/dis34 for i in vec34])
    vec43 = array([i/dis34 for i in vec43])

    #get the normalized vector
    vecUNABCp = cross(vec32, vec12)
    vecUNABC = array([i/norm(vecUNABCp) for i in vecUNABCp])

    vecUNBCDp = cross(vec43, vec23)
    vecUNBCD = array([i/norm(vecUNBCDp) for i in vecUNBCDp])

    afcmatrix12 = array([[float(0) for x in range(3)] for x in range(3)])
    afcmatrix43 = array([[float(0) for x in range(3)] for x in range(3)])
    for i in range(0, 3):
      for j in range(0, 3):
        afcmatrix12[i][j] = -fcmatrix[3*(nat1-1)+i][3*(nat2-1)+j]
    for i in range(0, 3):
      for j in range(0, 3):
        afcmatrix43[i][j] = -fcmatrix[3*(nat4-1)+i][3*(nat3-1)+j]
    eigval12, eigvector12 = eig(afcmatrix12)
    eigval43, eigvector43 = eig(afcmatrix43)

    contri12 = 0.0
    contri34 = 0.0
    for i in range(0, 3):
      ev12 = eigvector12[:,i]
      ev43 = eigvector43[:,i]
      contri12 = contri12 + eigval12[i] * abs(dot(vecUNABC, ev12))
      contri34 = contri34 + eigval43[i] * abs(dot(vecUNBCD, ev43))

    contri12 = contri12 * (norm(cross(vec12, vec23)) ** 2)
    contri34 = contri34 * (norm(cross(vec23, vec34)) ** 2)
    contri12 = 1.0 / (contri12 * dis12 * dis12)
    contri34 = 1.0 / (contri34 * dis34 * dis34)

    fcfinal1 = (1.0 / (contri12 + contri34)) * H_TO_KCAL_MOL * 0.5 #/ (math.degrees(1.0)**2)

    fcfinal = fcfinal1 * (math.radians(180.0/float(n2))) **2 / (float(n1) * float(n2))

    fcfinal = fcfinal * scalef * scalef

    return dihval, fcfinal1, fcfinal
Пример #5
0
def get_rmsd(initparas):

    global idxs, mcresids2, atompairs

    #Modify the C4 terms in the prmtop file
    for i in range(0, len(idxs)):
        prmtop.parm_data['LENNARD_JONES_CCOEF'][idxs[i]] = initparas[i]

    #Overwrite the prmtop file
    prmtop.write_parm('OptC4.top')

    #Perform the OpenMM optimization
    #Use AmberParm function to transfer the topology and
    #coordinate file to the object OpenMM can use
    Ambermol = AmberParm('OptC4.top', options.cfile)

    # Create the OpenMM system
    print('Creating OpenMM System')
    if options.simupha == 'gas':
        system = Ambermol.createSystem(nonbondedMethod=app.NoCutoff)
    elif options.simupha == 'liquid':
        system = Ambermol.createSystem(
            nonbondedMethod=app.PME,
            nonbondedCutoff=8.0 * u.angstroms,
            constraints=app.HBonds,
        )

    #Add restraints
    force = mm.CustomExternalForce("k*((x-x0)^2+(y-y0)^2+(z-z0)^2)")
    force.addGlobalParameter("k", 200.0)
    force.addPerParticleParameter("x0")
    force.addPerParticleParameter("y0")
    force.addPerParticleParameter("z0")
    #for i in range(0, len(Ambermol.atoms)):
    for i, atom_crd in enumerate(Ambermol.positions):
        #if (Ambermol.atoms[i].residue.number+1 not in mcresids2) and \
        if (i+1 not in mcresids2) and \
          (Ambermol.atoms[i].residue.name not in ['WAT', 'HOH']) and \
          (Ambermol.atoms[i].name in ['CA', 'C', 'N']):
            force.addParticle(i, atom_crd.value_in_unit(u.nanometers))
    system.addForce(force)

    # Create the integrator to do Langevin dynamics
    # Temperature of heat bath, Friction coefficient, Time step
    integrator = mm.LangevinIntegrator(
        300 * u.kelvin,
        1.0 / u.picoseconds,
        1.0 * u.femtoseconds,
    )

    # Define the platform to use; CUDA, OpenCL, CPU, or Reference. Or do not
    # specify the platform to use the default (fastest) platform
    # Create the Simulation object
    if options.platf == 'ref':
        platform = mm.Platform.getPlatformByName('Reference')
        sim = app.Simulation(Ambermol.topology, system, integrator, platform)
    elif options.platf == 'cpu':
        platform = mm.Platform.getPlatformByName('CPU')
        sim = app.Simulation(Ambermol.topology, system, integrator, platform)
    elif options.platf == 'cuda':
        platform = mm.Platform.getPlatformByName('CUDA')
        prop = dict(CudaPrecision=options.presn)
        sim = app.Simulation(Ambermol.topology, system, integrator, platform,
                             prop)
    elif options.platf == 'opencl':
        platform = mm.Platform.getPlatformByName('OpenCL')
        prop = dict(OpenCLPrecision=options.presn)
        sim = app.Simulation(Ambermol.topology, system, integrator, platform,
                             prop)

    # Set the particle positions
    sim.context.setPositions(Ambermol.positions)

    # Output the rst file
    restrt = RestartReporter(options.rfile, 100, write_velocities=False)
    sim.reporters.append(restrt)

    # Minimize the energy
    print('Minimizing energy ' + str(options.maxsteps) + ' steps.')
    sim.minimizeEnergy(maxIterations=options.maxsteps)

    # Overwrite the final file
    state = sim.context.getState(getPositions=True, enforcePeriodicBox=True)
    restrt.report(sim, state)

    val_aft_min = []
    crds_aft_min = read_rstf(options.rfile)
    for i in atompairs:
        if len(i) == 2:
            crd1 = crds_aft_min[i[0] - 1]
            crd2 = crds_aft_min[i[1] - 1]
            bond = calc_bond(crd1, crd2)
            val_aft_min.append(('bond', bond))
        elif len(i) == 3:
            crd1 = crds_aft_min[i[0] - 1]
            crd2 = crds_aft_min[i[1] - 1]
            crd3 = crds_aft_min[i[2] - 1]
            angle = calc_angle(crd1, crd2, crd3)
            val_aft_min.append(('angle', angle))
        elif len(i) == 4:
            crd1 = crds_aft_min[i[0] - 1]
            crd2 = crds_aft_min[i[1] - 1]
            crd3 = crds_aft_min[i[2] - 1]
            crd4 = crds_aft_min[i[3] - 1]
            dih = calc_dih(crd1, crd2, crd3, crd4)
            val_aft_min.append(('dih', dih))

    valdiffs = []
    for i in range(0, len(atompairs)):
        if val_bf_min[i][0] == 'bond':
            valdiff = abs(val_aft_min[i][1] - val_bf_min[i][1]) * 1.0 / 100.0
        elif val_bf_min[i][0] == 'angle':
            valdiff = abs(val_aft_min[i][1] - val_bf_min[i][1]) * 1.0 / 2.0
        elif val_bf_min[i][0] == 'dih':
            valdiff = abs(val_aft_min[i][1] - val_bf_min[i][1])
            if (360.0 - valdiff < valdiff):
                valdiff = 360.0 - valdiff
        valdiffs.append(valdiff)

    fnldiff = numpy.sum(valdiffs)
    print(fnldiff)

    return fnldiff
Пример #6
0
        crd1 = crds_bf_min[i[0] - 1]
        crd2 = crds_bf_min[i[1] - 1]
        bond = calc_bond(crd1, crd2)
        val_bf_min.append(('bond', bond))
    elif len(i) == 3:
        crd1 = crds_bf_min[i[0] - 1]
        crd2 = crds_bf_min[i[1] - 1]
        crd3 = crds_bf_min[i[2] - 1]
        angle = calc_angle(crd1, crd2, crd3)
        val_bf_min.append(('angle', angle))
    elif len(i) == 4:
        crd1 = crds_bf_min[i[0] - 1]
        crd2 = crds_bf_min[i[1] - 1]
        crd3 = crds_bf_min[i[2] - 1]
        crd4 = crds_bf_min[i[3] - 1]
        dih = calc_dih(crd1, crd2, crd3, crd4)
        val_bf_min.append(('dih', dih))

#print("Bond, angle and dihedral before minimization...")
#print(val_bf_min)

#-----------------------------------------------------------------------------#
#Get the Amber mask of the metal center complex and print it into ptraj.in file
#-----------------------------------------------------------------------------#

#Print the parmed input file, add new LJ types to the bonded atoms
maskns = []
for i in smcids:
    maskn = str(mol.atoms[i].resid) + '@' + mol.atoms[i].atname
    maskns.append(maskn)