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
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)
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
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
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
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)