def test_RESPASystem_with_exception_offsets(): system, positions, topology, solute = readSystem( 'hydroxyethylaminoanthraquinone-in-water') respa_info = dict(rcutIn=7 * unit.angstroms, rswitchIn=5 * unit.angstroms) solvation_system = atomsmm.SolvationSystem(system, solute) nbforce = solvation_system.getForce( atomsmm.findNonbondedForce(solvation_system)) for index in range(nbforce.getNumExceptions()): i, j, chargeprod, sigma, epsilon = nbforce.getExceptionParameters( index) nbforce.setExceptionParameters(index, i, j, 0.0, sigma, epsilon) nbforce.addExceptionParameterOffset('lambda_coul', index, chargeprod, 0.0, 0.0) respa_system = atomsmm.RESPASystem(solvation_system, *respa_info.values()) state = dict(lambda_vdw=0.5, lambda_coul=0.5) components = atomsmm.splitPotentialEnergy(respa_system, topology, positions, **state) potential = dict() potential['HarmonicBondForce'] = 1815.1848188179738 potential['HarmonicAngleForce'] = 1111.5544374007236 potential['PeriodicTorsionForce'] = 1.5998609986459567 potential['Real-Space'] = 58201.09912379701 potential['Reciprocal-Space'] = -76436.3982762784 potential['CustomNonbondedForce'] = -64.67189605331785 potential['CustomNonbondedForce(1)'] = -17294.836032921234 potential['CustomNonbondedForce(2)'] = 17294.836032921194 potential['CustomBondForce'] = 72.25414937535754 potential['Total'] = -15299.377781942048 for term, value in components.items(): assert value / value.unit == pytest.approx(potential[term])
def executeFarForceTest(OuterForceType, adjustment): rswitch_inner = 6.5 * unit.angstroms rcut_inner = 7.0 * unit.angstroms rswitch = 9.5 * unit.angstroms rcut = 10 * unit.angstroms case = 'tests/data/q-SPC-FW' pdb = app.PDBFile(case + '.pdb') forcefield = app.ForceField(case + '.xml') system = forcefield.createSystem(pdb.topology, nonbondedMethod=openmm.app.PME) nbforce = atomsmm.hijackForce(system, atomsmm.findNonbondedForce(system)) innerforce = atomsmm.NearNonbondedForce(rcut_inner, rswitch_inner, adjustment) innerforce.importFrom(nbforce).addTo(system) outerforce = OuterForceType(innerforce, rcut, rswitch).setForceGroup(2) outerforce.importFrom(nbforce).addTo(system) potential = atomsmm.splitPotentialEnergy(system, pdb.topology, pdb.positions)["Total"] refsys = forcefield.createSystem(pdb.topology, nonbondedMethod=openmm.app.PME, nonbondedCutoff=rcut, removeCMMotion=True) force = refsys.getForce(refsys.getNumForces() - 2) force.setUseSwitchingFunction(True) force.setSwitchingDistance(rswitch) refpot = atomsmm.splitPotentialEnergy(refsys, pdb.topology, pdb.positions)["Total"] assert potential / potential.unit == pytest.approx(refpot / refpot.unit)
def execute(shifted): rswitch_inner = 6.5*unit.angstroms rcut_inner = 7.0*unit.angstroms rswitch = 9.5*unit.angstroms rcut = 10*unit.angstroms case = 'tests/data/q-SPC-FW' pdb = app.PDBFile(case + '.pdb') forcefield = app.ForceField(case + '.xml') system = forcefield.createSystem(pdb.topology) nbforce = atomsmm.hijackForce(system, atomsmm.findNonbondedForce(system)) exceptions = atomsmm.NonbondedExceptionsForce() exceptions.importFrom(nbforce).addTo(system) innerforce = atomsmm.NearNonbondedForce(rcut_inner, rswitch_inner, shifted).setForceGroup(1) innerforce.importFrom(nbforce).addTo(system) outerforce = atomsmm.FarNonbondedForce(innerforce, rcut, rswitch).setForceGroup(2) outerforce.importFrom(nbforce).addTo(system) potential = atomsmm.splitPotentialEnergy(system, pdb.topology, pdb.positions) refsys = forcefield.createSystem(pdb.topology, nonbondedMethod=openmm.app.PME, nonbondedCutoff=rcut, removeCMMotion=True) force = refsys.getForce(refsys.getNumForces()-2) force.setUseSwitchingFunction(True) force.setSwitchingDistance(rswitch) refpot = atomsmm.splitPotentialEnergy(refsys, pdb.topology, pdb.positions) E = potential["Total"] refE = refpot["Total"] assert E/E.unit == pytest.approx(refE/refE.unit) E = potential["CustomBondForce"] + potential["NonbondedForce"] refE = refpot["NonbondedForce"] assert E/E.unit == pytest.approx(refE/refE.unit)
def execute(integrator, target): system, positions, topology = readSystem('emim_BCN4_Jiung2014') nbforce = atomsmm.findNonbondedForce(system) system.getForce(nbforce).setReciprocalSpaceForceGroup(1) platform = openmm.Platform.getPlatformByName('Reference') simulation = app.Simulation(topology, system, integrator, platform) simulation.context.setPositions(positions) simulation.context.setVelocitiesToTemperature(300*unit.kelvin, 1) simulation.step(5) state = simulation.context.getState(getEnergy=True) potential = state.getPotentialEnergy() print(potential, target) assert potential/potential.unit == pytest.approx(target)
def __init__(self, system, atoms, group=0): self.this = copy.deepcopy(system).this nonbonded = self.getForce(atomsmm.findNonbondedForce(self)) potential = '4*lambda_vdw*epsilon*(1 - x)/x^2' potential += '; x=(r/sigma)^6 + 0.5*(1 - lambda_vdw)' potential += '; sigma = 0.5*(sigma1 + sigma2)' potential += '; epsilon = sqrt(epsilon1*epsilon2)' softcore = openmm.CustomNonbondedForce(potential) if nonbonded.getNonbondedMethod() == openmm.NonbondedForce.NoCutoff: softcore.setNonbondedMethod(openmm.CustomNonbondedForce.NoCutoff) else: softcore.setNonbondedMethod( openmm.CustomNonbondedForce.CutoffPeriodic) softcore.setCutoffDistance(nonbonded.getCutoffDistance()) softcore.setUseSwitchingFunction(nonbonded.getUseSwitchingFunction()) softcore.setSwitchingDistance(nonbonded.getSwitchingDistance()) # softcore.setUseLongRangeCorrection(nonbonded.getUseDispersionCorrection()) softcore.setUseLongRangeCorrection(False) softcore.addGlobalParameter('lambda_vdw', 1.0) softcore.addPerParticleParameter('sigma') softcore.addPerParticleParameter('epsilon') all = range(nonbonded.getNumParticles()) for index in all: _, sigma, epsilon = nonbonded.getParticleParameters(index) softcore.addParticle([sigma, epsilon]) softcore.addInteractionGroup(atoms, set(all) - set(atoms)) softcore.setForceGroup(group) softcore.addEnergyParameterDerivative('lambda_vdw') self.addForce(softcore) parameters = [] for index in atoms: parameters.append(nonbonded.getParticleParameters(index)) nonbonded.setParticleParameters(index, 0.0, 1.0, 0.0) exception_pairs = [] for index in range(nonbonded.getNumExceptions()): i, j, _, _, _ = nonbonded.getExceptionParameters(index) if set([i, j]).issubset(atoms): exception_pairs.append(set([i, j])) for i, j in itertools.combinations(atoms, 2): if set([i, j]) not in exception_pairs: q1, sig1, eps1 = parameters[i] q2, sig2, eps2 = parameters[j] nonbonded.addException(i, j, q1 * q2, (sig1 + sig2) / 2, np.sqrt(eps1 * eps2)) softcore.addExclusion( i, j) # Needed for matching exception number
def readSystem(case): pdb = app.PDBFile('tests/data/%s.pdb' % case) forcefield = app.ForceField('tests/data/%s.xml' % case) system = forcefield.createSystem(pdb.topology, nonbondedMethod=openmm.app.PME, nonbondedCutoff=10 * unit.angstroms, rigidWater=False, constraints=None, removeCMMotion=False) nbforce = system.getForce(atomsmm.findNonbondedForce(system)) nbforce.setUseSwitchingFunction(True) nbforce.setSwitchingDistance(9 * unit.angstroms) residues = [atom.residue.name for atom in pdb.topology.atoms()] solute_atoms = set(i for (i, name) in enumerate(residues) if name == 'aaa') return system, pdb.positions, pdb.topology, solute_atoms
def execute(degree, target): rcut = 10*unit.angstroms rswitch = 9.5*unit.angstroms alpha = 0.29/unit.angstroms case = 'tests/data/q-SPC-FW' pdb = app.PDBFile(case + '.pdb') forcefield = app.ForceField(case + '.xml') system = forcefield.createSystem(pdb.topology, nonbondedMethod=app.CutoffPeriodic) force = atomsmm.DampedSmoothedForce(alpha, rcut, rswitch, degree=degree) force.importFrom(atomsmm.hijackForce(system, atomsmm.findNonbondedForce(system))).addTo(system) integrator = openmm.VerletIntegrator(0.0*unit.femtoseconds) platform = openmm.Platform.getPlatformByName('Reference') simulation = app.Simulation(pdb.topology, system, integrator, platform) simulation.context.setPositions(pdb.positions) state = simulation.context.getState(getEnergy=True) potential = state.getPotentialEnergy() assert potential/potential.unit == pytest.approx(target)
properties = dict(Precision='mixed') if args.platform == 'CUDA' else dict() if args.device != 'None': properties['DeviceIndex'] = args.device pdb = app.PDBFile(f'{base}.pdb') residues = [atom.residue.name for atom in pdb.topology.atoms()] solute_atoms = set(i for (i, name) in enumerate(residues) if name == 'aaa') forcefield = app.ForceField(f'{base}.xml') openmm_system = forcefield.createSystem(pdb.topology, nonbondedMethod=openmm.app.PME, nonbondedCutoff=rcut, rigidWater=False, removeCMMotion=False) nbforce = openmm_system.getForce(atomsmm.findNonbondedForce(openmm_system)) nbforce.setUseSwitchingFunction(True) nbforce.setSwitchingDistance(rswitch) nbforce.setUseDispersionCorrection(True) solvation_system = atomsmm.SolvationSystem(openmm_system, solute_atoms, use_softcore=False, split_exceptions=False) if args.timestep > 3: respa_system = atomsmm.RESPASystem(solvation_system, rcutIn, rswitchIn, fastExceptions=True) loops = [6, args.timestep // 3, 1]
def __init__(self, system, atoms, coupling='softcore', group=0, use_lrc=False): self.this = copy.deepcopy(system).this nonbonded = self.getForce(atomsmm.findNonbondedForce(self)) if coupling == 'softcore': # Beutler et al. (1994) potential = 'U_softcore' potential += '; U_softcore = 4*lambda_vdw*epsilon*(1 - x)/x^2' potential += '; x = (r/sigma)^6 + 0.5*(1 - lambda_vdw)' else: if coupling in ['linear', 'spline', 'art']: potential = 'U_{}'.format(coupling) else: potential = 'U_general' potential += '; {} = 4*((gt0-gt1)*S + gt1)*epsilon*x*(x - 1)'.format( potential) potential += '; x = (sigma/r)^6' potential += '; gt0 = step(lambda_vdw)' potential += '; gt1 = step(lambda_vdw-1)' if coupling == 'linear': potential += '; S = lambda_vdw - sin(two_pi*lambda_vdw)/two_pi' elif coupling == 'spline': potential += '; S = lambda_vdw^3*(10 - 15*lambda_vdw + 6*lambda_vdw^2)' elif coupling == 'art': # Abrams, Rosso, and Tuckerman (2006) potential += '; S = lambda_vdw - sin(two_pi*lambda_vdw)/two_pi' potential += '; two_pi = 6.28318530717958' else: potential += '; S = {}'.format(coupling) potential += '; sigma = 0.5*(sigma1 + sigma2)' potential += '; epsilon = sqrt(epsilon1*epsilon2)' softcore = openmm.CustomNonbondedForce(potential) if nonbonded.getNonbondedMethod() == openmm.NonbondedForce.NoCutoff: softcore.setNonbondedMethod(openmm.CustomNonbondedForce.NoCutoff) else: softcore.setNonbondedMethod( openmm.CustomNonbondedForce.CutoffPeriodic) softcore.setCutoffDistance(nonbonded.getCutoffDistance()) softcore.setUseSwitchingFunction(nonbonded.getUseSwitchingFunction()) softcore.setSwitchingDistance(nonbonded.getSwitchingDistance()) # softcore.setUseLongRangeCorrection(nonbonded.getUseDispersionCorrection()) softcore.setUseLongRangeCorrection(use_lrc) softcore.addGlobalParameter('lambda_vdw', 1.0) softcore.addPerParticleParameter('sigma') softcore.addPerParticleParameter('epsilon') all_atoms = range(nonbonded.getNumParticles()) for index in all_atoms: _, sigma, epsilon = nonbonded.getParticleParameters(index) softcore.addParticle([sigma, epsilon]) for index in range(nonbonded.getNumExceptions()): i, j, _, _, epsilon = nonbonded.getExceptionParameters(index) softcore.addExclusion(i, j) softcore.addInteractionGroup(atoms, set(all_atoms) - set(atoms)) softcore.setForceGroup(group) softcore.addEnergyParameterDerivative('lambda_vdw') self.addForce(softcore) parameters = {} for i in atoms: parameters[i] = nonbonded.getParticleParameters(i) nonbonded.setParticleParameters(i, 0.0, 1.0, 0.0) exception_pairs = [] for index in range(nonbonded.getNumExceptions()): i, j, _, _, _ = nonbonded.getExceptionParameters(index) if set([i, j]).issubset(atoms): exception_pairs.append(set([i, j])) for i, j in itertools.combinations(atoms, 2): if set([i, j]) not in exception_pairs: q1, sig1, eps1 = parameters[i] q2, sig2, eps2 = parameters[j] nonbonded.addException(i, j, q1 * q2, (sig1 + sig2) / 2, np.sqrt(eps1 * eps2)) softcore.addExclusion( i, j) # Needed for matching exception number
def __init__(self, system, solute_atoms, use_softcore=True, softcore_group=0, split_exceptions=False): self.this = copy.deepcopy(system).this nonbonded = self.getForce(atomsmm.findNonbondedForce(self)) all_atoms = set(range(nonbonded.getNumParticles())) solvent_atoms = all_atoms - solute_atoms # If requested, extract preexisting non-exclusion exceptions: if split_exceptions: ljc_potential = '4*epsilon*x*(x-1) + Kc*chargeprod/r; x=(sigma/r)^6; Kc=138.935456' exceptions = atomsmm.forces._AtomsMM_CustomBondForce(ljc_potential) exceptions.importFrom(nonbonded, extract=True) if exceptions.getNumBonds() > 0: self.addForce(exceptions) # A custom nonbonded force for solute-solvent, softcore van der Waals interactions: if use_softcore: ljs_potential = '4*lambda_vdw*epsilon*(1-x)/x^2; x=(r/sigma)^6+0.5*(1-lambda_vdw)' softcore = atomsmm.forces._AtomsMM_CustomNonbondedForce( ljs_potential, lambda_vdw=1) softcore.importFrom(nonbonded) softcore.addInteractionGroup(solute_atoms, solvent_atoms) softcore.setForceGroup(softcore_group) self.addForce(softcore) # All solute-solute interactions are treated as nonbonded exceptions: exception_pairs = [] for index in range(nonbonded.getNumExceptions()): i, j, _, _, _ = nonbonded.getExceptionParameters(index) if set([i, j]).issubset(solute_atoms): exception_pairs.append(set([i, j])) for i, j in itertools.combinations(solute_atoms, 2): if set([i, j]) not in exception_pairs: q1, sig1, eps1 = nonbonded.getParticleParameters(i) q2, sig2, eps2 = nonbonded.getParticleParameters(j) nonbonded.addException(i, j, q1 * q2, (sig1 + sig2) / 2, np.sqrt(eps1 * eps2)) if use_softcore: softcore.addExclusion( i, j) # Needed for matching exception number # Turn off or scale solute Lennard-Jones interactions, scale solute charges: lj_parameters = dict() charges = dict() for index in solute_atoms: charge, sigma, epsilon = nonbonded.getParticleParameters(index) nonbonded.setParticleParameters(index, 0.0, 0.0, 0.0) if charge / charge.unit != 0.0: charges[index] = charge if epsilon / epsilon.unit != 0.0: lj_parameters[index] = (sigma, epsilon) if charges: nonbonded.addGlobalParameter('lambda_coul', 1.0) for index, charge in charges.items(): nonbonded.addParticleParameterOffset('lambda_coul', index, charge, 0.0, 0.0) if lj_parameters and not use_softcore: nonbonded.addGlobalParameter('lambda_vdw', 1.0) for index, (sigma, epsilon) in lj_parameters.items(): nonbonded.addParticleParameterOffset('lambda_vdw', index, 0.0, sigma, epsilon)
rcut = 10 * unit.angstroms shift = True mts = False # mts = True # case = 'q-SPC-FW' case = 'emim_BCN4_Jiung2014' pdb = app.PDBFile('../../tests/data/%s.pdb' % case) forcefield = app.ForceField('../../tests/data/%s.xml' % case) system = forcefield.createSystem(pdb.topology, nonbondedMethod=openmm.app.PME, nonbondedCutoff=rcut, rigidWater=False) nbforceIndex = atomsmm.findNonbondedForce(system) dof = atomsmm.countDegreesOfFreedom(system) if mts: nbforce = atomsmm.hijackForce(system, nbforceIndex) exceptions = atomsmm.NonbondedExceptionsForce().setForceGroup(0) innerForce = atomsmm.NearNonbondedForce(rcutIn, rswitchIn, shift).setForceGroup(1) outerForce = atomsmm.FarNonbondedForce(innerForce, rcut, rswitch).setForceGroup(2) for force in [exceptions, innerForce, outerForce]: force.importFrom(nbforce) force.addTo(system) NVE = atomsmm.RespaPropagator([2, 2, 1]) integrator = atomsmm.GlobalThermostatIntegrator(dt, NVE) else: nbforce = system.getForce(nbforceIndex)
from __future__ import print_function import pytest from simtk import openmm from simtk import unit from simtk.openmm import app import atomsmm def test_exceptions(): case = 'tests/data/emim_BCN4_Jiung2014' pdb = app.PDBFile(case + '.pdb') forcefield = app.ForceField(case + '.xml') system = forcefield.createSystem(pdb.topology, nonbondedMethod=app.CutoffPeriodic) force = atomsmm.forces.NonbondedExceptionsForce() force.importFrom( atomsmm.hijackForce(system, atomsmm.findNonbondedForce(system))).addTo(system) integrator = openmm.VerletIntegrator(0.0 * unit.femtoseconds) platform = openmm.Platform.getPlatformByName('Reference') simulation = app.Simulation(pdb.topology, system, integrator, platform) simulation.context.setPositions(pdb.positions) state = simulation.context.getState(getEnergy=True) potential = state.getPotentialEnergy() assert potential / potential.unit == pytest.approx(-27616.298459208883)