コード例 #1
0
ファイル: test_systems.py プロジェクト: atoms-ufrj/atomsmm
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])
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
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)
コード例 #5
0
ファイル: systems.py プロジェクト: pinheirothiagoj/atomsmm
    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
コード例 #6
0
ファイル: test_systems.py プロジェクト: atoms-ufrj/atomsmm
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
コード例 #7
0
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)
コード例 #8
0
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]
コード例 #9
0
ファイル: systems.py プロジェクト: atoms-ufrj/atomsmm
    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
コード例 #10
0
ファイル: systems.py プロジェクト: atoms-ufrj/atomsmm
    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)
コード例 #11
0
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)
コード例 #12
0
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)