def setup_aatopology(self): GMIN.initialize() pot = GMINPotential(GMIN) coords = pot.getCoords() nrigid = old_div(coords.size, 6) print("I have %d water molecules in the system"%nrigid) print("The initial energy is", pot.getEnergy(coords)) water = create_base() system = RBTopology() system.add_sites([deepcopy(water) for i in range(nrigid)]) self.potential = pot self.nrigid = nrigid self.render_scale = 0.15 self.atom_types = system.get_atomtypes() self.draw_bonds = [] for i in range(nrigid-1): self.draw_bonds.append((2*i, 2*i+1)) self.draw_bonds.append((2*i, 2*i+2)) return system
def setup_aatopology(self): GMIN.initialize() pot = GMINPotential(GMIN) coords = pot.getCoords() nrigid = coords.size / 6 print "I have %d PAP molecules in the system" % nrigid print "The initial energy is", pot.getEnergy(coords) water = create_pap() system = RBTopology() system.add_sites([deepcopy(water) for i in xrange(nrigid)]) self.potential = pot self.nrigid = nrigid self.render_scale = 0.1 self.atom_types = system.get_atomtypes() self.draw_bonds = [] for i in xrange(nrigid): self.draw_bonds.append((3 * i, 3 * i + 1)) self.draw_bonds.append((3 * i, 3 * i + 2)) return system
def setup_aatopology(self): GMIN.initialize() pot = GMINPotential(GMIN) coords = pot.getCoords() nrigid = coords.size / 6 print "I have %d water molecules in the system"%nrigid print "The initial energy is", pot.getEnergy(coords) water = tip4p.water() system = RBTopology() system.add_sites([deepcopy(water) for i in xrange(nrigid)]) self.potential = pot self.nrigid = nrigid self.render_scale = 0.3 self.atom_types = system.get_atomtypes() self.draw_bonds = [] for i in xrange(nrigid): self.draw_bonds.append((3*i, 3*i+1)) self.draw_bonds.append((3*i, 3*i+2)) return system
def getEnergy(self, coords): E = GMINPotential.getEnergy(self, coords) ca = CoordsAdapter(nrigid=coords.size / 6, coords=coords) RMX = [rmdrvt(p, True) for p in ca.rotRigid] xback = np.array([x - 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)]) xbase = np.array([x + 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)]) Eangle = 0 v2 = xback[1] - xback[0] v2 /= np.linalg.norm(v2) for i in xrange(1, ca.nrigid - 1): v1 = -v2.copy() v2 = xback[i + 1] - xback[i] v2 /= np.linalg.norm(v2) theta = np.arccos(np.dot(v1, v2)) Eangle += 0.5 * self.k * (theta - self.theta0) ** 2 # add the torsion angle Etorsion = 0 if self.use_torsion: for i in xrange(ca.nrigid - 3): theta = dihedral_angle(xback[i : i + 4]) Etorsion += U_torsion_back(theta) return E + Eangle + Etorsion
def getEnergy(self, coords): E = GMINPotential.getEnergy(self, coords) ca = CoordsAdapter(nrigid=old_div(coords.size, 6), coords=coords) RMX = [rotMatDeriv(p, True) for p in ca.rotRigid] xback = np.array([ x - 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ]) xbase = np.array([ x + 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ]) Eangle = 0 v2 = xback[1] - xback[0] v2 /= np.linalg.norm(v2) for i in range(1, ca.nrigid - 1): v1 = -v2.copy() v2 = xback[i + 1] - xback[i] v2 /= np.linalg.norm(v2) theta = np.arccos(np.dot(v1, v2)) Eangle += 0.5 * self.k * (theta - self.theta0)**2 # add the torsion angle Etorsion = 0 if self.use_torsion: for i in range(ca.nrigid - 3): theta = dihedral_angle(xback[i:i + 4]) Etorsion += U_torsion_back(theta) return E + Eangle + Etorsion
def getEnergyGradient(self, coords): #return self.getEnergy(coords), self.NumericalDerivative(coords) E, grad = GMINPotential.getEnergyGradient(self, coords) ca = CoordsAdapter(nrigid=old_div(coords.size, 6), coords=coords) RMX = [rotMatDeriv(p, True) for p in ca.rotRigid] xback = [ x - 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ] xbase = [ x - 0.4 * np.dot(r[0], np.array([1., 0., 0.])) for x, r in zip(ca.posRigid, RMX) ] gback = np.zeros_like(xback) Eangle = 0. v2 = xback[1] - xback[0] absv2 = np.linalg.norm(v2) v2 /= absv2 for i in range(1, ca.nrigid - 1): v1 = -v2 absv1 = absv2 v2 = xback[i + 1] - xback[i] absv2 = np.linalg.norm(v2) v2 /= absv2 v1v2 = np.dot(v1, v2) theta = np.arccos(v1v2) Eangle += 0.5 * self.k * (theta - self.theta0)**2 acos_prime = 1. / np.sqrt(1. - v1v2**2) s = self.k * (theta - self.theta0) * acos_prime gback[i - 1] += s * (old_div(-v2, absv1) + old_div(v1v2 * v1, absv1)) gback[i] += s * (old_div(v1, absv2) + old_div(v2, absv1) - old_div( v1v2 * v1, absv1) - old_div(v1v2 * v2, absv2)) gback[i + 1] += s * (old_div(-v1, absv2) + old_div(v1v2 * v2, absv2)) Etorsion = 0 if self.use_torsion: for i in range(ca.nrigid - 3): r = xback[i:i + 4] theta = dihedral_angle(r) e_theta, g_theta = U_torsion_back_grad(theta) Etorsion += e_theta gback[i:i + 4] += g_theta * dihedral_gradient(r) cg = CoordsAdapter(nrigid=ca.nrigid, coords=grad) cg.posRigid += gback for i in range(ca.nrigid): x = -0.4 * np.array([1., 0., 0.]) R = RMX[i] cg.rotRigid[i][0] += np.dot(gback[i], np.dot(R[1], x)) cg.rotRigid[i][1] += np.dot(gback[i], np.dot(R[2], x)) cg.rotRigid[i][2] += np.dot(gback[i], np.dot(R[3], x)) return E + Eangle + Etorsion, grad
def __init__(self, *args, **kwargs): AppBasinHopping.__init__(self, *args, **kwargs) self.quenchRoutine = mylbfgs self.potential = GMINPotential(GMIN) self.quenchParameters["tol"] = 1e-4 self.quenchParameters["M"] = 80 self.quenchParameters["maxErise"] = 0.1 self.quenchRoutine = mylbfgs
def getEnergyGradient(self, coords): # return self.getEnergy(coords), self.NumericalDerivative(coords) E, grad = GMINPotential.getEnergyGradient(self, coords) ca = CoordsAdapter(nrigid=coords.size / 6, coords=coords) RMX = [rmdrvt(p, True) for p in ca.rotRigid] xback = [x - 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)] xbase = [x - 0.4 * np.dot(r[0], np.array([1.0, 0.0, 0.0])) for x, r in zip(ca.posRigid, RMX)] gback = np.zeros_like(xback) Eangle = 0.0 v2 = xback[1] - xback[0] absv2 = np.linalg.norm(v2) v2 /= absv2 for i in xrange(1, ca.nrigid - 1): v1 = -v2 absv1 = absv2 v2 = xback[i + 1] - xback[i] absv2 = np.linalg.norm(v2) v2 /= absv2 v1v2 = np.dot(v1, v2) theta = np.arccos(v1v2) Eangle += 0.5 * self.k * (theta - self.theta0) ** 2 acos_prime = 1.0 / np.sqrt(1.0 - v1v2 ** 2) s = self.k * (theta - self.theta0) * acos_prime gback[i - 1] += s * (-v2 / absv1 + v1v2 * v1 / absv1) gback[i] += s * (v1 / absv2 + v2 / absv1 - v1v2 * v1 / absv1 - v1v2 * v2 / absv2) gback[i + 1] += s * (-v1 / absv2 + v1v2 * v2 / absv2) Etorsion = 0 if self.use_torsion: for i in xrange(ca.nrigid - 3): r = xback[i : i + 4] theta = dihedral_angle(r) e_theta, g_theta = U_torsion_back_grad(theta) Etorsion += e_theta gback[i : i + 4] += g_theta * dihedral_gradient(r) cg = CoordsAdapter(nrigid=ca.nrigid, coords=grad) cg.posRigid += gback for i in xrange(ca.nrigid): x = -0.4 * np.array([1.0, 0.0, 0.0]) R = RMX[i] cg.rotRigid[i][0] += np.dot(gback[i], np.dot(R[1], x)) cg.rotRigid[i][1] += np.dot(gback[i], np.dot(R[2], x)) cg.rotRigid[i][2] += np.dot(gback[i], np.dot(R[3], x)) return E + Eangle + Etorsion, grad
def setup_aatopology(self): self.write_coords_data() GMIN.initialize() self.pot = GMINPotential(GMIN) coords = self.pot.getCoords() self.nrigid = coords.size/6 assert(self.nrigid == self.nmol) #self.nrigid = self.nmol otp = self.make_otp() topology = RBTopology() topology.add_sites([deepcopy(otp) for i in xrange(self.nrigid)]) self.render_scale = 0.2 self.atom_types = topology.get_atomtypes() self.draw_bonds = [] for i in xrange(self.nrigid): self.draw_bonds.append((3*i, 3*i+1)) self.draw_bonds.append((3*i, 3*i+2)) self.params.double_ended_connect.local_connect_params.tsSearchParams.iprint = 10 return topology
def check_converged(E, coords): if (E < (parameters.TARGET + parameters.EDIFF)): fl = open("stat.dat", "a") print("#found minimum") t1 = time.clock() timespent = t1 - t0 fl.write("#quenches, functioncalls, time\n") fl.write("%d %d %f\n" % (opt.stepnum, potential.ncalls, timespent)) fl.close() exit() # initialize GMIN GMIN.initialize() # create a potential which calls GMIN potential = GMINPotential(GMIN) # get the initial coorinates coords = potential.getCoords() coords = np.random.random(coords.shape) # create takestep routine # we combine a normal step taking group = takestep.BlockMoves() step1 = takestep.AdaptiveStepsize(OXDNATakestep(displace=parameters.displace, rotate=0.), frequency=50) step2 = takestep.AdaptiveStepsize(OXDNATakestep(displace=0., rotate=parameters.rotate), frequency=50) group.addBlock(100, step1)
def __init__(self, theta0=140.0 / 180.0 * np.pi, k=4.0, use_torsion=False): GMINPotential.__init__(self, GMIN) self.theta0 = theta0 self.k = k print "theta0 is", theta0 self.use_torsion = use_torsion
def __init__(self, theta0=140. / 180. * np.pi, k=4., use_torsion=False): GMINPotential.__init__(self, GMIN) self.theta0 = theta0 self.k = k print("theta0 is", theta0) self.use_torsion = use_torsion
import numpy as np from pele.potentials import GMINPotential import gmin_ as GMIN from pele.utils import rotations from pele.takestep import buildingblocks from pele.transition_states import NEB import pylab as pl from copy import deepcopy, copy from pele.optimize import mylbfgs from pele.angleaxis import RigidFragment, RBSystem import tip4p from tip4p import dump_path # initialize GMIN and potential GMIN.initialize() pot = GMINPotential(GMIN) coords = pot.getCoords() nrigid = old_div(coords.size, 6) print("I have %d water molecules in the system" % nrigid) water = tip4p.water() #water.S = np.identity(3, dtype="float64") #water.S*=10. # define the whole water system system = RBSystem() system.add_sites([deepcopy(water) for i in range(nrigid)]) # this is an easy access wrapper for coordinates array ca = system.coords_adapter(coords)
def check_converged(E, coords): if(E<(parameters.TARGET+parameters.EDIFF)): fl = open("stat.dat", "a") print "#found minimum" t1= time.clock() timespent= t1 - t0 fl.write("#quenches, functioncalls, time\n") fl.write("%d %d %f\n"%(opt.stepnum , potential.ncalls , timespent)) fl.close() exit() # initialize GMIN GMIN.initialize() # create a potential which calls GMIN potential = GMINPotential(GMIN) # get the initial coorinates coords=potential.getCoords() coords=np.random.random(coords.shape) # create takestep routine # we combine a normal step taking group = takestep.BlockMoves() step1 = takestep.AdaptiveStepsize(OXDNATakestep(displace=parameters.displace, rotate=0.), frequency=50) step2 = takestep.AdaptiveStepsize(OXDNATakestep(displace=0., rotate=parameters.rotate), frequency=50) group.addBlock(100, step1) group.addBlock(100, step2) # with a generate random configuration genrandom = OXDNAReseed() # in a reseeding takestep procedure
class OTPSystem(RBSystem): def __init__(self, nmol, boxl=None): # super(OTPSystem, self) self.nmol = nmol if boxl is None: self.periodic = False self.boxl = 1e100 else: self.periodic = True self.boxl = boxl super(OTPSystem, self).__init__() self.setup_params(self.params) def get_rigid_fragment(self): return RigidFragment() def make_otp(self): otp = self.get_rigid_fragment() otp.add_atom("O", np.array([0.0, -2./3 * np.sin( 7.*pi/24.), 0.0]), 1.) otp.add_atom("O", np.array([cos( 7.*pi/24.), 1./3. * sin( 7.* pi/24.), 0.0]), 1.) otp.add_atom("O", np.array([-cos( 7.* pi/24.), 1./3. * sin( 7.*pi/24), 0.0]), 1.) otp.finalize_setup() return otp def setup_params(self, params): params.gui["basinhopping_nsteps"] = 1000 nebparams = params.double_ended_connect.local_connect_params.NEBparams nebparams.max_images = 50 nebparams.image_density = 5 nebparams.iter_density = 10. nebparams.k = 5. nebparams.reinterpolate = 50 nebparams.NEBquenchParams["iprint"] = 10 tssearch = params.double_ended_connect.local_connect_params.tsSearchParams tssearch.nsteps_tangent1 = 10 tssearch.nsteps_tangent2 = 30 tssearch.lowestEigenvectorQuenchParams["nsteps"] = 50 tssearch.iprint=1 tssearch.nfail_max = 100 def get_random_coordinates(self): coords = np.zeros([self.nmol*2, 3]) coords[:self.nmol,:] = np.random.uniform(-1,1,[self.nmol,3]) * (self.nmol*3)**(-1./3) * 1.5 from pele.utils.rotations import random_aa for i in range(self.nmol, self.nmol*2): coords[i,:] = random_aa() return coords.flatten() def write_coords_data(self): coords = self.get_random_coordinates() coords = coords.reshape(-1,3) with open("coords", "w") as fout: for xyz in coords: fout.write( "%f %f %f\n" % tuple(xyz) ) data = "LWOTP 2.614\n" if self.periodic: data += "periodic %f %f %f\n" % (self.boxl, self.boxl, self.boxl) with open("data", "w") as fout: fout.write(data) def setup_aatopology(self): self.write_coords_data() GMIN.initialize() self.pot = GMINPotential(GMIN) coords = self.pot.getCoords() self.nrigid = coords.size/6 assert(self.nrigid == self.nmol) #self.nrigid = self.nmol otp = self.make_otp() topology = RBTopology() topology.add_sites([deepcopy(otp) for i in xrange(self.nrigid)]) self.render_scale = 0.2 self.atom_types = topology.get_atomtypes() self.draw_bonds = [] for i in xrange(self.nrigid): self.draw_bonds.append((3*i, 3*i+1)) self.draw_bonds.append((3*i, 3*i+2)) self.params.double_ended_connect.local_connect_params.tsSearchParams.iprint = 10 return topology def get_potential(self): #return OTPPotential(self.aasystem) return self.pot def __call__(self): return self def load_coords_pymol(self, coordslist, oname, index=1): import pymol super(OTPSystem, self).load_coords_pymol(coordslist, oname, index=index) pymol.cmd.set("sphere_scale", value=0.2, selection=oname)
import numpy as np from pele.potentials import GMINPotential import gmin_ as GMIN from pele.utils import rotations from pele.takestep import buildingblocks from pele.transition_states import NEB import pylab as pl from copy import deepcopy, copy from pele.optimize import mylbfgs from pele.angleaxis import RigidFragment, RBSystem import tip4p from tip4p import dump_path # initialize GMIN and potential GMIN.initialize() pot = GMINPotential(GMIN) coords = pot.getCoords() nrigid = coords.size / 6 print "I have %d water molecules in the system"%nrigid water = tip4p.water() #water.S = np.identity(3, dtype="float64") #water.S*=10. # define the whole water system system = RBSystem() system.add_sites([deepcopy(water) for i in xrange(nrigid)]) # this is an easy access wrapper for coordinates array ca = system.coords_adapter(coords)