Commit d7569df2 authored by Peter Eastman's avatar Peter Eastman
Browse files

Merge remote-tracking branch 'origin/master' into qc

parents 4089b688 0c00acd2
......@@ -40,6 +40,11 @@ import simtk.unit as unit
import element as elem
from simtk.openmm.app import Topology
def _convertParameterToNumber(param):
if unit.is_quantity(param):
return mm.stripUnits((param,))[0]
return float(param)
# Enumerated values for nonbonded method
class NoCutoff(object):
......@@ -115,13 +120,7 @@ class ForceField(object):
if tree.getroot().find('AtomTypes') is not None:
for type in tree.getroot().find('AtomTypes').findall('Type'):
element = None
if 'element' in type.attrib:
element = elem.get_by_symbol(type.attrib['element'])
name = type.attrib['name']
if name in self._atomTypes:
raise ValueError('Found multiple definitions for atom type: '+name)
self._atomTypes[name] = (type.attrib['class'], float(type.attrib['mass']), element)
self.registerAtomType(type.attrib)
# Load the residue templates.
......@@ -129,38 +128,17 @@ class ForceField(object):
for residue in root.find('Residues').findall('Residue'):
resName = residue.attrib['name']
template = ForceField._TemplateData(resName)
self._templates[resName] = template
for atom in residue.findall('Atom'):
template.atoms.append(ForceField._TemplateAtomData(atom.attrib['name'], atom.attrib['type'], self._atomTypes[atom.attrib['type']][2]))
for site in residue.findall('VirtualSite'):
template.virtualSites.append(ForceField._VirtualSiteData(site))
for bond in residue.findall('Bond'):
b = (int(bond.attrib['from']), int(bond.attrib['to']))
template.bonds.append(b)
template.atoms[b[0]].bondedTo.append(b[1])
template.atoms[b[1]].bondedTo.append(b[0])
template.addBond(int(bond.attrib['from']), int(bond.attrib['to']))
for bond in residue.findall('ExternalBond'):
b = int(bond.attrib['from'])
template.externalBonds.append(b)
template.atoms[b].externalBonds += 1
for template in self._templates.values():
signature = _createResidueSignature([atom.element for atom in template.atoms])
if signature in self._templateSignatures:
self._templateSignatures[signature].append(template)
else:
self._templateSignatures[signature] = [template]
# Build sets of every atom type belonging to each class
for type in self._atomTypes:
atomClass = self._atomTypes[type][0]
if atomClass in self._atomClasses:
typeSet = self._atomClasses[atomClass]
else:
typeSet = set()
self._atomClasses[atomClass] = typeSet
typeSet.add(type)
self._atomClasses[''].add(type)
self.registerResidueTemplate(template)
# Load force definitions
......@@ -171,12 +149,53 @@ class ForceField(object):
# Load scripts
for node in tree.getroot().findall('Script'):
self._scripts.append(node.text)
self.registerScript(node.text)
def _findAtomTypes(self, node, num):
def getGenerators(self):
"""Get the list of all registered generators."""
return self._forces
def registerGenerator(self, generator):
"""Register a new generator."""
self._forces.append(generator)
def registerAtomType(self, parameters):
"""Register a new atom type."""
name = parameters['name']
if name in self._atomTypes:
raise ValueError('Found multiple definitions for atom type: '+name)
atomClass = parameters['class']
mass = _convertParameterToNumber(parameters['mass'])
element = None
if 'element' in parameters:
element = parameters['element']
if not isinstance(element, elem.Element):
element = elem.get_by_symbol(element)
self._atomTypes[name] = (atomClass, mass, element)
if atomClass in self._atomClasses:
typeSet = self._atomClasses[atomClass]
else:
typeSet = set()
self._atomClasses[atomClass] = typeSet
typeSet.add(name)
self._atomClasses[''].add(name)
def registerResidueTemplate(self, template):
"""Register a new residue template."""
self._templates[template.name] = template
signature = _createResidueSignature([atom.element for atom in template.atoms])
if signature in self._templateSignatures:
self._templateSignatures[signature].append(template)
else:
self._templateSignatures[signature] = [template]
def registerScript(self, script):
"""Register a new script to be executed after building the System."""
self._scripts.append(script)
def _findAtomTypes(self, attrib, num):
"""Parse the attributes on an XML tag to find the set of atom types for each atom it involves."""
types = []
attrib = node.attrib
for i in range(num):
if num == 1:
suffix = ''
......@@ -186,7 +205,7 @@ class ForceField(object):
typeAttrib = 'type'+suffix
if classAttrib in attrib:
if typeAttrib in attrib:
raise ValueError('Tag specifies both a type and a class for the same atom: '+etree.tostring(node))
raise ValueError('Specified both a type and a class for the same atom: '+str(attrib))
if attrib[classAttrib] not in self._atomClasses:
types.append(None) # Unknown atom class
else:
......@@ -198,18 +217,17 @@ class ForceField(object):
types.append([attrib[typeAttrib]])
return types
def _parseTorsion(self, node):
def _parseTorsion(self, attrib):
"""Parse the node defining a torsion."""
types = self._findAtomTypes(node, 4)
types = self._findAtomTypes(attrib, 4)
if None in types:
return None
torsion = PeriodicTorsion(types)
attrib = node.attrib
index = 1
while 'phase%d'%index in attrib:
torsion.periodicity.append(int(attrib['periodicity%d'%index]))
torsion.phase.append(float(attrib['phase%d'%index]))
torsion.k.append(float(attrib['k%d'%index]))
torsion.phase.append(_convertParameterToNumber(attrib['phase%d'%index]))
torsion.k.append(_convertParameterToNumber(attrib['k%d'%index]))
index += 1
return torsion
......@@ -235,6 +253,11 @@ class ForceField(object):
self.bonds = []
self.externalBonds = []
def addBond(self, atom1, atom2):
self.bonds.append((atom1, atom2))
self.atoms[atom1].bondedTo.append(atom2)
self.atoms[atom2].bondedTo.append(atom1)
class _TemplateAtomData:
"""Inner class used to encapsulate data about an atom in a residue template definition."""
def __init__(self, name, type, element):
......@@ -660,23 +683,27 @@ def _findMatchErrors(forcefield, res):
class HarmonicBondGenerator:
"""A HarmonicBondGenerator constructs a HarmonicBondForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.types1 = []
self.types2 = []
self.length = []
self.k = []
def registerBond(self, parameters):
types = self.ff._findAtomTypes(parameters, 2)
if None not in types:
self.types1.append(types[0])
self.types2.append(types[1])
self.length.append(_convertParameterToNumber(parameters['length']))
self.k.append(_convertParameterToNumber(parameters['k']))
@staticmethod
def parseElement(element, ff):
generator = HarmonicBondGenerator()
ff._forces.append(generator)
generator = HarmonicBondGenerator(ff)
ff.registerGenerator(generator)
for bond in element.findall('Bond'):
types = ff._findAtomTypes(bond, 2)
if None not in types:
generator.types1.append(types[0])
generator.types2.append(types[1])
generator.length.append(float(bond.attrib['length']))
generator.k.append(float(bond.attrib['k']))
generator.registerBond(bond.attrib)
def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):
existing = [sys.getForce(i) for i in range(sys.getNumForces())]
......@@ -707,25 +734,29 @@ parsers["HarmonicBondForce"] = HarmonicBondGenerator.parseElement
class HarmonicAngleGenerator:
"""A HarmonicAngleGenerator constructs a HarmonicAngleForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.types1 = []
self.types2 = []
self.types3 = []
self.angle = []
self.k = []
def registerAngle(self, parameters):
types = self.ff._findAtomTypes(parameters, 3)
if None not in types:
self.types1.append(types[0])
self.types2.append(types[1])
self.types3.append(types[2])
self.angle.append(_convertParameterToNumber(parameters['angle']))
self.k.append(_convertParameterToNumber(parameters['k']))
@staticmethod
def parseElement(element, ff):
generator = HarmonicAngleGenerator()
ff._forces.append(generator)
generator = HarmonicAngleGenerator(ff)
ff.registerGenerator(generator)
for angle in element.findall('Angle'):
types = ff._findAtomTypes(angle, 3)
if None not in types:
generator.types1.append(types[0])
generator.types2.append(types[1])
generator.types3.append(types[2])
generator.angle.append(float(angle.attrib['angle']))
generator.k.append(float(angle.attrib['k']))
generator.registerAngle(angle.attrib)
def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):
existing = [sys.getForce(i) for i in range(sys.getNumForces())]
......@@ -789,23 +820,29 @@ class PeriodicTorsion:
class PeriodicTorsionGenerator:
"""A PeriodicTorsionGenerator constructs a PeriodicTorsionForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.proper = []
self.improper = []
def registerProperTorsion(self, parameters):
torsion = self.ff._parseTorsion(parameters)
if torsion is not None:
self.proper.append(torsion)
def registerImproperTorsion(self, parameters):
torsion = self.ff._parseTorsion(parameters)
if torsion is not None:
self.improper.append(torsion)
@staticmethod
def parseElement(element, ff):
generator = PeriodicTorsionGenerator()
generator.ff = ff
ff._forces.append(generator)
generator = PeriodicTorsionGenerator(ff)
ff.registerGenerator(generator)
for torsion in element.findall('Proper'):
torsion = ff._parseTorsion(torsion)
if torsion is not None:
generator.proper.append(torsion)
generator.registerProperTorsion(torsion.attrib)
for torsion in element.findall('Improper'):
torsion = ff._parseTorsion(torsion)
if torsion is not None:
generator.improper.append(torsion)
generator.registerImproperTorsion(torsion.attrib)
def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):
existing = [sys.getForce(i) for i in range(sys.getNumForces())]
......@@ -888,21 +925,21 @@ class RBTorsion:
class RBTorsionGenerator:
"""An RBTorsionGenerator constructs an RBTorsionForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.proper = []
self.improper = []
@staticmethod
def parseElement(element, ff):
generator = RBTorsionGenerator()
generator.ff = ff
ff._forces.append(generator)
generator = RBTorsionGenerator(ff)
ff.registerGenerator(generator)
for torsion in element.findall('Proper'):
types = ff._findAtomTypes(torsion, 4)
types = ff._findAtomTypes(torsion.attrib, 4)
if None not in types:
generator.proper.append(RBTorsion(types, [float(torsion.attrib['c'+str(i)]) for i in range(6)]))
for torsion in element.findall('Improper'):
types = ff._findAtomTypes(torsion, 4)
types = ff._findAtomTypes(torsion.attrib, 4)
if None not in types:
generator.improper.append(RBTorsion(types, [float(torsion.attrib['c'+str(i)]) for i in range(6)]))
......@@ -984,15 +1021,15 @@ class CMAPTorsion:
class CMAPTorsionGenerator:
"""A CMAPTorsionGenerator constructs a CMAPTorsionForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.torsions = []
self.maps = []
@staticmethod
def parseElement(element, ff):
generator = CMAPTorsionGenerator()
generator.ff = ff
ff._forces.append(generator)
generator = CMAPTorsionGenerator(ff)
ff.registerGenerator(generator)
for map in element.findall('Map'):
values = [float(x) for x in map.text.split()]
size = sqrt(len(values))
......@@ -1000,7 +1037,7 @@ class CMAPTorsionGenerator:
raise ValueError('CMAP must have the same number of elements along each dimension')
generator.maps.append(values)
for torsion in element.findall('Torsion'):
types = ff._findAtomTypes(torsion, 5)
types = ff._findAtomTypes(torsion.attrib, 5)
if None not in types:
generator.torsions.append(CMAPTorsion(types, int(torsion.attrib['map'])))
......@@ -1064,28 +1101,32 @@ parsers["CMAPTorsionForce"] = CMAPTorsionGenerator.parseElement
class NonbondedGenerator:
"""A NonbondedGenerator constructs a NonbondedForce."""
def __init__(self, coulomb14scale, lj14scale):
def __init__(self, forcefield, coulomb14scale, lj14scale):
self.ff = forcefield
self.coulomb14scale = coulomb14scale
self.lj14scale = lj14scale
self.typeMap = {}
def registerAtom(self, parameters):
types = self.ff._findAtomTypes(parameters, 1)
if None not in types:
values = (_convertParameterToNumber(parameters['charge']), _convertParameterToNumber(parameters['sigma']), _convertParameterToNumber(parameters['epsilon']))
for t in types[0]:
self.typeMap[t] = values
@staticmethod
def parseElement(element, ff):
existing = [f for f in ff._forces if isinstance(f, NonbondedGenerator)]
if len(existing) == 0:
generator = NonbondedGenerator(float(element.attrib['coulomb14scale']), float(element.attrib['lj14scale']))
ff._forces.append(generator)
generator = NonbondedGenerator(ff, float(element.attrib['coulomb14scale']), float(element.attrib['lj14scale']))
ff.registerGenerator(generator)
else:
# Multiple <NonbondedForce> tags were found, probably in different files. Simply add more types to the existing one.
generator = existing[0]
if generator.coulomb14scale != float(element.attrib['coulomb14scale']) or generator.lj14scale != float(element.attrib['lj14scale']):
raise ValueError('Found multiple NonbondedForce tags with different 1-4 scales')
for atom in element.findall('Atom'):
types = ff._findAtomTypes(atom, 1)
if None not in types:
values = (float(atom.attrib['charge']), float(atom.attrib['sigma']), float(atom.attrib['epsilon']))
for t in types[0]:
generator.typeMap[t] = values
generator.registerAtom(atom.attrib)
def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):
methodMap = {NoCutoff:mm.NonbondedForce.NoCutoff,
......@@ -1107,6 +1148,8 @@ class NonbondedGenerator:
force.setCutoffDistance(nonbondedCutoff)
if 'ewaldErrorTolerance' in args:
force.setEwaldErrorTolerance(args['ewaldErrorTolerance'])
if 'useDispersionCorrection' in args:
force.setUseDispersionCorrection(bool(args['useDispersionCorrection']))
sys.addForce(force)
def postprocessSystem(self, sys, data, args):
......@@ -1147,24 +1190,28 @@ parsers["NonbondedForce"] = NonbondedGenerator.parseElement
class GBSAOBCGenerator:
"""A GBSAOBCGenerator constructs a GBSAOBCForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.typeMap = {}
def registerAtom(self, parameters):
types = self.ff._findAtomTypes(parameters, 1)
if None not in types:
values = (_convertParameterToNumber(parameters['charge']), _convertParameterToNumber(parameters['radius']), _convertParameterToNumber(parameters['scale']))
for t in types[0]:
self.typeMap[t] = values
@staticmethod
def parseElement(element, ff):
existing = [f for f in ff._forces if isinstance(f, GBSAOBCGenerator)]
if len(existing) == 0:
generator = GBSAOBCGenerator()
ff._forces.append(generator)
generator = GBSAOBCGenerator(ff)
ff.registerGenerator(generator)
else:
# Multiple <GBSAOBCForce> tags were found, probably in different files. Simply add more types to the existing one.
generator = existing[0]
for atom in element.findall('Atom'):
types = ff._findAtomTypes(atom, 1)
if None not in types:
values = (float(atom.attrib['charge']), float(atom.attrib['radius']), float(atom.attrib['scale']))
for t in types[0]:
generator.typeMap[t] = values
generator.registerAtom(atom.attrib)
def createForce(self, sys, data, nonbondedMethod, nonbondedCutoff, args):
methodMap = {NoCutoff:mm.NonbondedForce.NoCutoff,
......@@ -1204,7 +1251,6 @@ class GBVIGenerator:
"""A GBVIGenerator constructs a GBVIForce."""
def __init__(self,ff):
self.ff = ff
self.fixedParameters = {}
self.fixedParameters['soluteDielectric'] = 1.0
......@@ -1222,9 +1268,9 @@ class GBVIGenerator:
if (key in element.attrib):
generator.fixedParameters[key] = float(element.attrib[key])
ff._forces.append(generator)
ff.registerGenerator(generator)
for atom in element.findall('Atom'):
types = ff._findAtomTypes(atom, 1)
types = ff._findAtomTypes(atom.attrib, 1)
if None not in types:
values = (float(atom.attrib['charge']), float(atom.attrib['radius']), float(atom.attrib['gamma']))
for t in types[0]:
......@@ -1290,7 +1336,8 @@ parsers["GBVIForce"] = GBVIGenerator.parseElement
class CustomBondGenerator:
"""A CustomBondGenerator constructs a CustomBondForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.types1 = []
self.types2 = []
self.globalParams = {}
......@@ -1299,15 +1346,15 @@ class CustomBondGenerator:
@staticmethod
def parseElement(element, ff):
generator = CustomBondGenerator()
ff._forces.append(generator)
generator = CustomBondGenerator(ff)
ff.registerGenerator(generator)
generator.energy = element.attrib['energy']
for param in element.findall('GlobalParameter'):
generator.globalParams[param.attrib['name']] = float(param.attrib['defaultValue'])
for param in element.findall('PerBondParameter'):
generator.perBondParams.append(param.attrib['name'])
for bond in element.findall('Bond'):
types = ff._findAtomTypes(bond, 2)
types = ff._findAtomTypes(bond.attrib, 2)
if None not in types:
generator.types1.append(types[0])
generator.types2.append(types[1])
......@@ -1337,7 +1384,8 @@ parsers["CustomBondForce"] = CustomBondGenerator.parseElement
class CustomAngleGenerator:
"""A CustomAngleGenerator constructs a CustomAngleForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.types1 = []
self.types2 = []
self.types3 = []
......@@ -1347,15 +1395,15 @@ class CustomAngleGenerator:
@staticmethod
def parseElement(element, ff):
generator = CustomAngleGenerator()
ff._forces.append(generator)
generator = CustomAngleGenerator(ff)
ff.registerGenerator(generator)
generator.energy = element.attrib['energy']
for param in element.findall('GlobalParameter'):
generator.globalParams[param.attrib['name']] = float(param.attrib['defaultValue'])
for param in element.findall('PerAngleParameter'):
generator.perAngleParams.append(param.attrib['name'])
for angle in element.findall('Angle'):
types = ff._findAtomTypes(angle, 3)
types = ff._findAtomTypes(angle.attrib, 3)
if None not in types:
generator.types1.append(types[0])
generator.types2.append(types[1])
......@@ -1399,7 +1447,8 @@ class CustomTorsion:
class CustomTorsionGenerator:
"""A CustomTorsionGenerator constructs a CustomTorsionForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.proper = []
self.improper = []
self.globalParams = {}
......@@ -1407,20 +1456,19 @@ class CustomTorsionGenerator:
@staticmethod
def parseElement(element, ff):
generator = CustomTorsionGenerator()
generator.ff = ff
ff._forces.append(generator)
generator = CustomTorsionGenerator(ff)
ff.registerGenerator(generator)
generator.energy = element.attrib['energy']
for param in element.findall('GlobalParameter'):
generator.globalParams[param.attrib['name']] = float(param.attrib['defaultValue'])
for param in element.findall('PerTorsionParameter'):
generator.perTorsionParams.append(param.attrib['name'])
for torsion in element.findall('Proper'):
types = ff._findAtomTypes(torsion, 4)
types = ff._findAtomTypes(torsion.attrib, 4)
if None not in types:
generator.proper.append(CustomTorsion(types, [float(torsion.attrib[param]) for param in generator.perTorsionParams]))
for torsion in element.findall('Improper'):
types = ff._findAtomTypes(torsion, 4)
types = ff._findAtomTypes(torsion.attrib, 4)
if None not in types:
generator.improper.append(CustomTorsion(types, [float(torsion.attrib[param]) for param in generator.perTorsionParams]))
......@@ -1489,7 +1537,8 @@ parsers["CustomTorsionForce"] = CustomTorsionGenerator.parseElement
class CustomNonbondedGenerator:
"""A CustomNonbondedGenerator constructs a CustomNonbondedForce."""
def __init__(self, energy, bondCutoff):
def __init__(self, forcefield, energy, bondCutoff):
self.ff = forcefield
self.energy = energy
self.bondCutoff = bondCutoff
self.typeMap = {}
......@@ -1499,14 +1548,14 @@ class CustomNonbondedGenerator:
@staticmethod
def parseElement(element, ff):
generator = CustomNonbondedGenerator(element.attrib['energy'], int(element.attrib['bondCutoff']))
ff._forces.append(generator)
generator = CustomNonbondedGenerator(ff, element.attrib['energy'], int(element.attrib['bondCutoff']))
ff.registerGenerator(generator)
for param in element.findall('GlobalParameter'):
generator.globalParams[param.attrib['name']] = float(param.attrib['defaultValue'])
for param in element.findall('PerParticleParameter'):
generator.perParticleParams.append(param.attrib['name'])
for atom in element.findall('Atom'):
types = ff._findAtomTypes(atom, 1)
types = ff._findAtomTypes(atom.attrib, 1)
if None not in types:
values = [float(atom.attrib[param]) for param in generator.perParticleParams]
for t in types[0]:
......@@ -1587,7 +1636,8 @@ parsers["CustomNonbondedForce"] = CustomNonbondedGenerator.parseElement
class CustomGBGenerator:
"""A CustomGBGenerator constructs a CustomGBForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.typeMap = {}
self.globalParams = {}
self.perParticleParams = []
......@@ -1597,14 +1647,14 @@ class CustomGBGenerator:
@staticmethod
def parseElement(element, ff):
generator = CustomGBGenerator()
ff._forces.append(generator)
generator = CustomGBGenerator(ff)
ff.registerGenerator(generator)
for param in element.findall('GlobalParameter'):
generator.globalParams[param.attrib['name']] = float(param.attrib['defaultValue'])
for param in element.findall('PerParticleParameter'):
generator.perParticleParams.append(param.attrib['name'])
for atom in element.findall('Atom'):
types = ff._findAtomTypes(atom, 1)
types = ff._findAtomTypes(atom.attrib, 1)
if None not in types:
values = [float(atom.attrib[param]) for param in generator.perParticleParams]
for t in types[0]:
......@@ -1727,7 +1777,7 @@ class AmoebaBondGenerator:
generator = AmoebaBondGenerator(float(element.attrib['bond-cubic']), float(element.attrib['bond-quartic']))
forceField._forces.append(generator)
for bond in element.findall('Bond'):
types = forceField._findAtomTypes(bond, 2)
types = forceField._findAtomTypes(bond.attrib, 2)
if None not in types:
generator.types1.append(types[0])
generator.types2.append(types[1])
......@@ -1840,7 +1890,7 @@ class AmoebaAngleGenerator:
generator = AmoebaAngleGenerator(forceField, float(element.attrib['angle-cubic']), float(element.attrib['angle-quartic']), float(element.attrib['angle-pentic']), float(element.attrib['angle-sextic']))
forceField._forces.append(generator)
for angle in element.findall('Angle'):
types = forceField._findAtomTypes(angle, 3)
types = forceField._findAtomTypes(angle.attrib, 3)
if None not in types:
generator.types1.append(types[0])
......@@ -2325,7 +2375,7 @@ class AmoebaTorsionGenerator:
# where ti=[amplitude_i,angle_i]
for torsion in element.findall('Torsion'):
types = forceField._findAtomTypes(torsion, 4)
types = forceField._findAtomTypes(torsion.attrib, 4)
if None not in types:
generator.types1.append(types[0])
......@@ -2436,7 +2486,7 @@ class AmoebaPiTorsionGenerator:
forceField._forces.append(generator)
for piTorsion in element.findall('PiTorsion'):
types = forceField._findAtomTypes(piTorsion, 2)
types = forceField._findAtomTypes(piTorsion.attrib, 2)
if None not in types:
generator.types1.append(types[0])
generator.types2.append(types[1])
......@@ -2555,7 +2605,7 @@ class AmoebaTorsionTorsionGenerator:
# <TorsionTorsion class1="3" class2="1" class3="2" class4="3" class5="1" grid="0" nx="25" ny="25" />
for torsionTorsion in element.findall('TorsionTorsion'):
types = forceField._findAtomTypes(torsionTorsion, 5)
types = forceField._findAtomTypes(torsionTorsion.attrib, 5)
if None not in types:
generator.types1.append(types[0])
......@@ -2793,7 +2843,7 @@ class AmoebaStretchBendGenerator:
# <StretchBend class1="2" class2="1" class3="4" k1="3.14005676385" k2="3.14005676385" />
for stretchBend in element.findall('StretchBend'):
types = forceField._findAtomTypes(stretchBend, 3)
types = forceField._findAtomTypes(stretchBend.attrib, 3)
if None not in types:
generator.types1.append(types[0])
......@@ -2950,7 +3000,7 @@ class AmoebaVdwGenerator:
# sigma is modified based on radiustype and radiussize
for atom in element.findall('Vdw'):
types = forceField._findAtomTypes(atom, 1)
types = forceField._findAtomTypes(atom.attrib, 1)
if None not in types:
values = [float(atom.attrib['sigma']), float(atom.attrib['epsilon']), float(atom.attrib['reduction'])]
......@@ -3037,7 +3087,7 @@ class AmoebaVdwGenerator:
# dispersion correction
if ('useDispersionCorrection' in args):
force.setUseDispersionCorrection(int(args['useDispersionCorrection']))
force.setUseDispersionCorrection(bool(args['useDispersionCorrection']))
if (nonbondedMethod == PME):
force.setNonbondedMethod(mm.AmoebaVdwForce.CutoffPeriodic)
......@@ -3223,7 +3273,7 @@ class AmoebaMultipoleGenerator:
# set type map: [ kIndices, multipoles, AMOEBA/OpenMM axis type]
for atom in element.findall('Multipole'):
types = forceField._findAtomTypes(atom, 1)
types = forceField._findAtomTypes(atom.attrib, 1)
if None not in types:
# k-indices not provided default to 0
......@@ -3280,7 +3330,7 @@ class AmoebaMultipoleGenerator:
# polarization parameters
for atom in element.findall('Polarize'):
types = forceField._findAtomTypes(atom, 1)
types = forceField._findAtomTypes(atom.attrib, 1)
if None not in types:
classIndex = atom.attrib['type']
......@@ -3808,7 +3858,7 @@ class AmoebaWcaDispersionGenerator:
# typeMap[] = [ radius, epsilon ]
for atom in element.findall('WcaDispersion'):
types = forceField._findAtomTypes(atom, 1)
types = forceField._findAtomTypes(atom.attrib, 1)
if None not in types:
values = [float(atom.attrib['radius']), float(atom.attrib['epsilon'])]
......@@ -4152,7 +4202,7 @@ class AmoebaUreyBradleyGenerator:
generator = AmoebaUreyBradleyGenerator()
forceField._forces.append(generator)
for bond in element.findall('UreyBradley'):
types = forceField._findAtomTypes(bond, 3)
types = forceField._findAtomTypes(bond.attrib, 3)
if None not in types:
generator.types1.append(types[0])
......@@ -4203,20 +4253,21 @@ parsers["AmoebaUreyBradleyForce"] = AmoebaUreyBradleyGenerator.parseElement
class DrudeGenerator:
"""A DrudeGenerator constructs a DrudeForce."""
def __init__(self):
def __init__(self, forcefield):
self.ff = forcefield
self.typeMap = {}
@staticmethod
def parseElement(element, ff):
existing = [f for f in ff._forces if isinstance(f, DrudeGenerator)]
if len(existing) == 0:
generator = DrudeGenerator()
ff._forces.append(generator)
generator = DrudeGenerator(ff)
ff.registerGenerator(generator)
else:
# Multiple <DrudeForce> tags were found, probably in different files. Simply add more types to the existing one.
generator = existing[0]
for particle in element.findall('Particle'):
types = ff._findAtomTypes(particle, 5)
types = ff._findAtomTypes(particle.attrib, 5)
if None not in types[:2]:
aniso12 = 0.0
aniso34 = 0.0
......
......@@ -111,7 +111,7 @@ class GromacsTopFile(object):
if len(fields) < 2:
raise ValueError('Illegal line in .top file: '+line)
name = fields[1]
valueStart = stripped.find(name, len(command))+len(name)
valueStart = stripped.find(name, len(command))+len(name)+1
value = line[valueStart:].strip()
self._defines[name] = value
elif command == '#ifdef':
......
......@@ -12,7 +12,7 @@ Copyright (c) 2014 the Authors
Author: Jason M. Swails
Contributors:
Date: April 18, 2014
Date: July 3, 2014
Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the "Software"),
......@@ -501,7 +501,7 @@ class Angle(object):
""" See if a bond or an atom is in this angle """
if isinstance(thing, Bond):
return self.atom2 in thing and (self.atom1 in thing or
self.atom2 in thing)
self.atom3 in thing)
# Otherwise assume it's an atom
return self.atom1 is thing or self.atom2 is thing or self.atom3 is thing
......
......@@ -8,7 +8,8 @@ class TestBytes(unittest.TestCase):
system.addParticle(1.0)
refPositions = [(0,0,0)]
context = mm.Context(system, mm.VerletIntegrator(0))
platform = mm.Platform.getPlatformByName('Reference')
context = mm.Context(system, mm.VerletIntegrator(0), platform)
context.setPositions(refPositions)
chk = context.createCheckpoint()
# check that the return value of createCheckpoint is of type bytes (non-unicode)
......
......@@ -4,6 +4,7 @@ from simtk.openmm.app import *
from simtk.openmm import *
from simtk.unit import *
import simtk.openmm.app.element as elem
import simtk.openmm.app.forcefield as forcefield
class TestForceField(unittest.TestCase):
"""Test the ForceField.createSystem() method."""
......@@ -19,6 +20,7 @@ class TestForceField(unittest.TestCase):
self.topology1 = self.pdb1.topology
self.topology1.setUnitCellDimensions(Vec3(2, 2, 2))
# alalnine dipeptide with implicit water
self.pdb2 = PDBFile('systems/alanine-dipeptide-implicit.pdb')
self.forcefield2 = ForceField('amber99sb.xml', 'amber99_obc.xml')
......@@ -38,6 +40,18 @@ class TestForceField(unittest.TestCase):
f.getNonbondedMethod()==methodMap[method]
for f in forces))
def test_DispersionCorrection(self):
"""Test to make sure the nonbondedCutoff parameter is passed correctly."""
for useDispersionCorrection in [True, False]:
system = self.forcefield1.createSystem(self.pdb1.topology,
nonbondedCutoff=2*nanometer,
useDispersionCorrection=useDispersionCorrection)
for force in system.getForces():
if isinstance(force, NonbondedForce):
self.assertEqual(useDispersionCorrection, force.getUseDispersionCorrection())
def test_Cutoff(self):
"""Test to make sure the nonbondedCutoff parameter is passed correctly."""
......@@ -120,6 +134,113 @@ class TestForceField(unittest.TestCase):
totalMass2 = sum([system2.getParticleMass(i) for i in range(system2.getNumParticles())]).value_in_unit(amu)
self.assertAlmostEqual(totalMass1, totalMass2)
def test_Forces(self):
"""Compute forces and compare them to ones generated with a previous version of OpenMM to ensure they haven't changed."""
pdb = PDBFile('systems/lysozyme-implicit.pdb')
system = self.forcefield2.createSystem(pdb.topology)
integrator = VerletIntegrator(0.001)
context = Context(system, integrator)
context.setPositions(pdb.positions)
state1 = context.getState(getForces=True)
state2 = XmlSerializer.deserialize(open('systems/lysozyme-implicit-forces.xml').read())
numDifferences = 0
for f1, f2, in zip(state1.getForces().value_in_unit(kilojoules_per_mole/nanometer), state2.getForces().value_in_unit(kilojoules_per_mole/nanometer)):
diff = norm(f1-f2)
if diff > 0.1 and diff/norm(f1) > 1e-3:
numDifferences += 1
self.assertTrue(numDifferences < system.getNumParticles()/20) # Tolerate occasional differences from numerical error
def test_ProgrammaticForceField(self):
"""Test building a ForceField programmatically."""
# Build the ForceField for TIP3P programmatically.
ff = ForceField()
ff.registerAtomType({'name':'tip3p-O', 'class':'OW', 'mass':15.99943*daltons, 'element':elem.oxygen})
ff.registerAtomType({'name':'tip3p-H', 'class':'HW', 'mass':1.007947*daltons, 'element':elem.hydrogen})
residue = ForceField._TemplateData('HOH')
residue.atoms.append(ForceField._TemplateAtomData('O', 'tip3p-O', elem.oxygen))
residue.atoms.append(ForceField._TemplateAtomData('H1', 'tip3p-H', elem.hydrogen))
residue.atoms.append(ForceField._TemplateAtomData('H2', 'tip3p-H', elem.hydrogen))
residue.addBond(0, 1)
residue.addBond(0, 2)
ff.registerResidueTemplate(residue)
bonds = forcefield.HarmonicBondGenerator(ff)
bonds.registerBond({'class1':'OW', 'class2':'HW', 'length':0.09572*nanometers, 'k':462750.4*kilojoules_per_mole/nanometer})
ff.registerGenerator(bonds)
angles = forcefield.HarmonicAngleGenerator(ff)
angles.registerAngle({'class1':'HW', 'class2':'OW', 'class3':'HW', 'angle':1.82421813418*radians, 'k':836.8*kilojoules_per_mole/radian})
ff.registerGenerator(angles)
nonbonded = forcefield.NonbondedGenerator(ff, 0.833333, 0.5)
nonbonded.registerAtom({'type':'tip3p-O', 'charge':-0.834, 'sigma':0.31507524065751241*nanometers, 'epsilon':0.635968*kilojoules_per_mole})
nonbonded.registerAtom({'type':'tip3p-H', 'charge':0.417, 'sigma':1*nanometers, 'epsilon':0*kilojoules_per_mole})
ff.registerGenerator(nonbonded)
# Build a water box.
modeller = Modeller(Topology(), [])
modeller.addSolvent(ff, boxSize=Vec3(3, 3, 3)*nanometers)
# Create a system using the programmatic force field as well as one from an XML file.
system1 = ff.createSystem(modeller.topology)
ff2 = ForceField('tip3p.xml')
system2 = ff2.createSystem(modeller.topology)
self.assertEqual(XmlSerializer.serialize(system1), XmlSerializer.serialize(system2))
class AmoebaTestForceField(unittest.TestCase):
"""Test the ForceField.createSystem() method with the AMOEBA forcefield."""
def setUp(self):
"""Set up the tests by loading the input pdb files and force field
xml files.
"""
self.pdb1 = PDBFile('systems/amoeba-ion-in-water.pdb')
self.forcefield1 = ForceField('amoeba2009.xml')
self.topology1 = self.pdb1.topology
def test_NonbondedMethod(self):
"""Test all five options for the nonbondedMethod parameter."""
methodMap = {NoCutoff:AmoebaMultipoleForce.NoCutoff,
PME:AmoebaMultipoleForce.PME}
for method in methodMap:
system = self.forcefield1.createSystem(self.pdb1.topology,
nonbondedMethod=method)
forces = system.getForces()
self.assertTrue(any(isinstance(f, AmoebaMultipoleForce) and
f.getNonbondedMethod()==methodMap[method]
for f in forces))
def test_Cutoff(self):
"""Test to make sure the nonbondedCutoff parameter is passed correctly."""
cutoff_distance = 0.7*nanometer
for method in [NoCutoff, PME]:
system = self.forcefield1.createSystem(self.pdb1.topology,
nonbondedMethod=method,
nonbondedCutoff=cutoff_distance,
constraints=None)
for force in system.getForces():
if isinstance(force, AmoebaVdwForce):
self.assertEqual(force.getCutoff(), cutoff_distance)
if isinstance(force, AmoebaMultipoleForce):
self.assertEqual(force.getCutoffDistance(), cutoff_distance)
def test_DispersionCorrection(self):
"""Test to make sure the nonbondedCutoff parameter is passed correctly."""
for useDispersionCorrection in [True, False]:
system = self.forcefield1.createSystem(self.pdb1.topology,
nonbondedMethod=PME,
useDispersionCorrection=useDispersionCorrection)
for force in system.getForces():
if isinstance(force, AmoebaVdwForce):
self.assertEqual(useDispersionCorrection, force.getUseDispersionCorrection())
if __name__ == '__main__':
unittest.main()
......
TITLE Generated by filecnv.py : Water Cubic Box (18.643 Ang, 216 AMOEBA)
REMARK THIS IS A SIMULATION BOX
CRYST1 18.640 18.640 18.640 90.00 90.00 90.00 P 1 1
MODEL 1
ATOM 1 O HOH 1 8.039 5.868 0.493 1.00 0.00
ATOM 2 H1 HOH 1 7.581 5.023 0.404 1.00 0.00
ATOM 3 H2 HOH 1 8.287 6.062 -0.397 1.00 0.00
ATOM 4 O HOH 2 0.115 -8.877 6.446 1.00 0.00
ATOM 5 H1 HOH 2 0.959 -8.446 6.405 1.00 0.00
ATOM 6 H2 HOH 2 0.247 -9.794 6.138 1.00 0.00
ATOM 7 O HOH 3 -6.576 -0.253 8.105 1.00 0.00
ATOM 8 H1 HOH 3 -6.646 0.690 7.896 1.00 0.00
ATOM 9 H2 HOH 3 -6.685 -0.401 9.104 1.00 0.00
ATOM 10 O HOH 4 6.583 0.855 -6.669 1.00 0.00
ATOM 11 H1 HOH 4 6.260 0.887 -5.765 1.00 0.00
ATOM 12 H2 HOH 4 6.169 0.053 -7.054 1.00 0.00
ATOM 13 O HOH 5 5.495 6.436 1.842 1.00 0.00
ATOM 14 H1 HOH 5 4.774 6.561 1.208 1.00 0.00
ATOM 15 H2 HOH 5 6.254 6.349 1.235 1.00 0.00
ATOM 16 O HOH 6 -4.665 -8.502 -2.653 1.00 0.00
ATOM 17 H1 HOH 6 -4.505 -8.388 -3.607 1.00 0.00
ATOM 18 H2 HOH 6 -5.565 -8.751 -2.596 1.00 0.00
ATOM 19 O HOH 7 -7.755 -4.661 4.905 1.00 0.00
ATOM 20 H1 HOH 7 -7.358 -5.440 5.311 1.00 0.00
ATOM 21 H2 HOH 7 -7.076 -4.177 4.404 1.00 0.00
ATOM 22 O HOH 8 -0.282 7.487 -7.686 1.00 0.00
ATOM 23 H1 HOH 8 -0.794 7.446 -6.826 1.00 0.00
ATOM 24 H2 HOH 8 0.170 8.381 -7.637 1.00 0.00
ATOM 25 O HOH 9 -3.711 -2.262 -1.917 1.00 0.00
ATOM 26 H1 HOH 9 -4.424 -2.426 -2.472 1.00 0.00
ATOM 27 H2 HOH 9 -4.023 -2.211 -0.972 1.00 0.00
ATOM 28 O HOH 10 -5.812 -5.616 0.835 1.00 0.00
ATOM 29 H1 HOH 10 -6.676 -5.712 1.297 1.00 0.00
ATOM 30 H2 HOH 10 -5.143 -5.532 1.560 1.00 0.00
ATOM 31 O HOH 11 8.528 5.000 3.444 1.00 0.00
ATOM 32 H1 HOH 11 8.866 4.760 4.341 1.00 0.00
ATOM 33 H2 HOH 11 7.683 4.540 3.378 1.00 0.00
ATOM 34 O HOH 12 0.063 3.962 -6.445 1.00 0.00
ATOM 35 H1 HOH 12 -0.645 4.454 -6.001 1.00 0.00
ATOM 36 H2 HOH 12 0.070 3.123 -5.989 1.00 0.00
ATOM 37 O HOH 13 0.169 6.582 6.098 1.00 0.00
ATOM 38 H1 HOH 13 0.291 6.371 7.040 1.00 0.00
ATOM 39 H2 HOH 13 -0.396 5.942 5.671 1.00 0.00
ATOM 40 O HOH 14 3.739 6.291 8.132 1.00 0.00
ATOM 41 H1 HOH 14 4.150 6.101 9.011 1.00 0.00
ATOM 42 H2 HOH 14 4.395 5.921 7.527 1.00 0.00
ATOM 43 O HOH 15 3.250 4.562 -2.564 1.00 0.00
ATOM 44 H1 HOH 15 3.743 4.531 -3.375 1.00 0.00
ATOM 45 H2 HOH 15 2.699 5.379 -2.486 1.00 0.00
ATOM 46 O HOH 16 5.618 5.202 6.376 1.00 0.00
ATOM 47 H1 HOH 16 5.619 5.614 5.531 1.00 0.00
ATOM 48 H2 HOH 16 5.490 4.269 6.211 1.00 0.00
ATOM 49 O HOH 17 -8.775 6.941 -6.178 1.00 0.00
ATOM 50 H1 HOH 17 -8.218 7.319 -5.471 1.00 0.00
ATOM 51 H2 HOH 17 -9.036 7.737 -6.649 1.00 0.00
ATOM 52 O HOH 18 -6.941 2.249 7.194 1.00 0.00
ATOM 53 H1 HOH 18 -7.367 2.209 6.349 1.00 0.00
ATOM 54 H2 HOH 18 -7.415 2.897 7.720 1.00 0.00
ATOM 55 O HOH 19 4.829 -0.184 3.152 1.00 0.00
ATOM 56 H1 HOH 19 5.557 0.243 2.724 1.00 0.00
ATOM 57 H2 HOH 19 4.135 0.501 3.237 1.00 0.00
ATOM 58 O HOH 20 -2.202 -3.107 9.171 1.00 0.00
ATOM 59 H1 HOH 20 -2.320 -4.072 9.247 1.00 0.00
ATOM 60 H2 HOH 20 -2.802 -2.935 8.421 1.00 0.00
ATOM 61 O HOH 21 1.689 6.673 -2.435 1.00 0.00
ATOM 62 H1 HOH 21 1.972 7.519 -2.054 1.00 0.00
ATOM 63 H2 HOH 21 0.874 6.423 -1.954 1.00 0.00
ATOM 64 O HOH 22 -9.080 -6.244 -0.882 1.00 0.00
ATOM 65 H1 HOH 22 -8.673 -7.043 -0.480 1.00 0.00
ATOM 66 H2 HOH 22 -8.364 -5.814 -1.383 1.00 0.00
ATOM 67 O HOH 23 -8.657 -8.654 0.563 1.00 0.00
ATOM 68 H1 HOH 23 -8.178 -9.465 0.842 1.00 0.00
ATOM 69 H2 HOH 23 -9.453 -8.686 1.056 1.00 0.00
ATOM 70 O HOH 24 -5.772 -2.632 -4.588 1.00 0.00
ATOM 71 H1 HOH 24 -5.457 -3.169 -5.272 1.00 0.00
ATOM 72 H2 HOH 24 -5.550 -1.707 -4.739 1.00 0.00
ATOM 73 O HOH 25 7.237 -8.468 -6.950 1.00 0.00
ATOM 74 H1 HOH 25 7.990 -8.965 -7.276 1.00 0.00
ATOM 75 H2 HOH 25 7.508 -8.173 -6.060 1.00 0.00
ATOM 76 O HOH 26 -2.377 -6.252 1.292 1.00 0.00
ATOM 77 H1 HOH 26 -1.831 -6.216 0.487 1.00 0.00
ATOM 78 H2 HOH 26 -2.393 -5.371 1.645 1.00 0.00
ATOM 79 O HOH 27 0.833 -5.019 5.432 1.00 0.00
ATOM 80 H1 HOH 27 1.092 -5.764 4.863 1.00 0.00
ATOM 81 H2 HOH 27 0.148 -5.508 5.955 1.00 0.00
ATOM 82 O HOH 28 7.425 -2.742 0.838 1.00 0.00
ATOM 83 H1 HOH 28 6.867 -2.455 1.621 1.00 0.00
ATOM 84 H2 HOH 28 7.152 -3.642 0.725 1.00 0.00
ATOM 85 O HOH 29 -0.251 8.631 2.286 1.00 0.00
ATOM 86 H1 HOH 29 0.096 9.072 1.496 1.00 0.00
ATOM 87 H2 HOH 29 0.451 8.716 2.905 1.00 0.00
ATOM 88 O HOH 30 4.778 9.024 8.252 1.00 0.00
ATOM 89 H1 HOH 30 4.396 8.079 8.249 1.00 0.00
ATOM 90 H2 HOH 30 4.683 9.287 9.179 1.00 0.00
ATOM 91 O HOH 31 8.220 9.015 -2.508 1.00 0.00
ATOM 92 H1 HOH 31 8.519 8.140 -2.217 1.00 0.00
ATOM 93 H2 HOH 31 7.640 9.201 -1.814 1.00 0.00
ATOM 94 O HOH 32 -7.944 1.760 4.644 1.00 0.00
ATOM 95 H1 HOH 32 -7.921 2.353 3.866 1.00 0.00
ATOM 96 H2 HOH 32 -8.706 1.129 4.460 1.00 0.00
ATOM 97 O HOH 33 3.243 3.821 -8.247 1.00 0.00
ATOM 98 H1 HOH 33 2.832 4.291 -7.488 1.00 0.00
ATOM 99 H2 HOH 33 2.768 2.984 -8.262 1.00 0.00
ATOM 100 O HOH 34 7.558 -8.962 2.368 1.00 0.00
ATOM 101 H1 HOH 34 6.660 -8.703 2.710 1.00 0.00
ATOM 102 H2 HOH 34 8.154 -9.119 3.115 1.00 0.00
ATOM 103 O HOH 35 -8.425 3.501 -4.439 1.00 0.00
ATOM 104 H1 HOH 35 -7.569 3.951 -4.471 1.00 0.00
ATOM 105 H2 HOH 35 -8.698 3.546 -5.370 1.00 0.00
ATOM 106 O HOH 36 3.884 -4.850 6.532 1.00 0.00
ATOM 107 H1 HOH 36 4.124 -4.040 7.026 1.00 0.00
ATOM 108 H2 HOH 36 3.006 -4.640 6.051 1.00 0.00
ATOM 109 O HOH 37 6.206 -5.083 4.954 1.00 0.00
ATOM 110 H1 HOH 37 6.896 -5.351 5.633 1.00 0.00
ATOM 111 H2 HOH 37 5.366 -5.112 5.464 1.00 0.00
ATOM 112 O HOH 38 7.035 -5.175 -0.739 1.00 0.00
ATOM 113 H1 HOH 38 7.853 -5.654 -0.959 1.00 0.00
ATOM 114 H2 HOH 38 6.781 -4.792 -1.619 1.00 0.00
ATOM 115 O HOH 39 -4.412 -4.775 3.088 1.00 0.00
ATOM 116 H1 HOH 39 -5.065 -4.108 3.116 1.00 0.00
ATOM 117 H2 HOH 39 -4.659 -5.257 3.876 1.00 0.00
ATOM 118 O HOH 40 -9.194 -0.001 -2.536 1.00 0.00
ATOM 119 H1 HOH 40 -8.589 -0.704 -2.223 1.00 0.00
ATOM 120 H2 HOH 40 -8.744 0.832 -2.345 1.00 0.00
ATOM 121 O HOH 41 5.087 2.357 5.594 1.00 0.00
ATOM 122 H1 HOH 41 4.145 2.609 5.868 1.00 0.00
ATOM 123 H2 HOH 41 5.185 1.494 5.856 1.00 0.00
ATOM 124 O HOH 42 -4.683 -6.147 -1.679 1.00 0.00
ATOM 125 H1 HOH 42 -4.869 -5.961 -0.746 1.00 0.00
ATOM 126 H2 HOH 42 -4.916 -7.050 -1.813 1.00 0.00
ATOM 127 O HOH 43 -3.179 -0.054 -3.640 1.00 0.00
ATOM 128 H1 HOH 43 -2.225 -0.245 -3.524 1.00 0.00
ATOM 129 H2 HOH 43 -3.604 -0.351 -2.841 1.00 0.00
ATOM 130 O HOH 44 1.046 2.676 -2.268 1.00 0.00
ATOM 131 H1 HOH 44 1.843 3.245 -2.357 1.00 0.00
ATOM 132 H2 HOH 44 1.057 2.363 -1.383 1.00 0.00
ATOM 133 O HOH 45 -1.412 4.165 -2.732 1.00 0.00
ATOM 134 H1 HOH 45 -0.521 3.698 -2.666 1.00 0.00
ATOM 135 H2 HOH 45 -1.383 4.769 -1.944 1.00 0.00
ATOM 136 O HOH 46 -7.660 -2.122 -1.952 1.00 0.00
ATOM 137 H1 HOH 46 -8.019 -2.839 -1.356 1.00 0.00
ATOM 138 H2 HOH 46 -7.442 -2.604 -2.817 1.00 0.00
ATOM 139 O HOH 47 -1.360 1.967 2.035 1.00 0.00
ATOM 140 H1 HOH 47 -1.620 2.869 2.312 1.00 0.00
ATOM 141 H2 HOH 47 -2.179 1.451 1.920 1.00 0.00
ATOM 142 O HOH 48 6.290 -4.230 -7.656 1.00 0.00
ATOM 143 H1 HOH 48 6.233 -4.447 -6.717 1.00 0.00
ATOM 144 H2 HOH 48 6.335 -5.070 -8.050 1.00 0.00
ATOM 145 O HOH 49 9.159 -0.398 3.519 1.00 0.00
ATOM 146 H1 HOH 49 9.889 -0.447 2.916 1.00 0.00
ATOM 147 H2 HOH 49 8.413 -0.023 2.971 1.00 0.00
ATOM 148 O HOH 50 4.847 -0.826 6.008 1.00 0.00
ATOM 149 H1 HOH 50 3.902 -0.629 6.020 1.00 0.00
ATOM 150 H2 HOH 50 5.056 -0.799 5.078 1.00 0.00
ATOM 151 O HOH 51 -7.285 -3.465 7.597 1.00 0.00
ATOM 152 H1 HOH 51 -7.607 -3.697 6.732 1.00 0.00
ATOM 153 H2 HOH 51 -7.133 -2.492 7.565 1.00 0.00
ATOM 154 O HOH 52 -3.090 -3.803 6.552 1.00 0.00
ATOM 155 H1 HOH 52 -3.502 -4.557 6.104 1.00 0.00
ATOM 156 H2 HOH 52 -2.848 -3.218 5.793 1.00 0.00
ATOM 157 O HOH 53 -0.628 -0.643 -0.688 1.00 0.00
ATOM 158 H1 HOH 53 -0.750 0.199 -0.182 1.00 0.00
ATOM 159 H2 HOH 53 0.325 -0.889 -0.564 1.00 0.00
ATOM 160 O HOH 54 1.167 -6.679 1.145 1.00 0.00
ATOM 161 H1 HOH 54 0.652 -7.308 0.653 1.00 0.00
ATOM 162 H2 HOH 54 1.613 -6.178 0.472 1.00 0.00
ATOM 163 O HOH 55 0.886 -7.185 3.758 1.00 0.00
ATOM 164 H1 HOH 55 1.236 -8.069 3.709 1.00 0.00
ATOM 165 H2 HOH 55 0.920 -6.831 2.841 1.00 0.00
ATOM 166 O HOH 56 2.135 0.084 6.041 1.00 0.00
ATOM 167 H1 HOH 56 1.885 0.433 5.160 1.00 0.00
ATOM 168 H2 HOH 56 1.679 -0.767 6.079 1.00 0.00
ATOM 169 O HOH 57 0.184 0.302 8.421 1.00 0.00
ATOM 170 H1 HOH 57 -0.716 0.418 8.707 1.00 0.00
ATOM 171 H2 HOH 57 0.445 -0.630 8.637 1.00 0.00
ATOM 172 O HOH 58 -3.149 -1.997 -5.795 1.00 0.00
ATOM 173 H1 HOH 58 -3.232 -1.461 -5.013 1.00 0.00
ATOM 174 H2 HOH 58 -3.477 -1.481 -6.557 1.00 0.00
ATOM 175 O HOH 59 2.201 -0.482 -6.617 1.00 0.00
ATOM 176 H1 HOH 59 1.368 -0.946 -6.453 1.00 0.00
ATOM 177 H2 HOH 59 2.705 -1.216 -6.954 1.00 0.00
ATOM 178 O HOH 60 -1.572 -2.002 4.844 1.00 0.00
ATOM 179 H1 HOH 60 -0.747 -2.095 5.356 1.00 0.00
ATOM 180 H2 HOH 60 -1.852 -1.078 5.002 1.00 0.00
ATOM 181 O HOH 61 5.400 6.380 -8.004 1.00 0.00
ATOM 182 H1 HOH 61 5.037 7.155 -7.526 1.00 0.00
ATOM 183 H2 HOH 61 5.148 5.594 -7.490 1.00 0.00
ATOM 184 O HOH 62 -6.338 5.728 -1.743 1.00 0.00
ATOM 185 H1 HOH 62 -6.067 4.771 -1.768 1.00 0.00
ATOM 186 H2 HOH 62 -5.664 6.129 -2.295 1.00 0.00
ATOM 187 O HOH 63 -2.100 -2.775 0.706 1.00 0.00
ATOM 188 H1 HOH 63 -1.406 -3.020 1.364 1.00 0.00
ATOM 189 H2 HOH 63 -1.688 -2.182 0.070 1.00 0.00
ATOM 190 O HOH 64 -0.008 5.633 1.418 1.00 0.00
ATOM 191 H1 HOH 64 -0.737 5.003 1.551 1.00 0.00
ATOM 192 H2 HOH 64 -0.256 6.473 1.771 1.00 0.00
ATOM 193 O HOH 65 3.960 -1.908 -1.971 1.00 0.00
ATOM 194 H1 HOH 65 4.389 -1.569 -1.158 1.00 0.00
ATOM 195 H2 HOH 65 3.764 -1.183 -2.532 1.00 0.00
ATOM 196 O HOH 66 0.396 -2.409 8.942 1.00 0.00
ATOM 197 H1 HOH 66 -0.496 -2.716 8.996 1.00 0.00
ATOM 198 H2 HOH 66 0.843 -2.715 9.772 1.00 0.00
ATOM 199 O HOH 67 -5.904 -3.598 -7.198 1.00 0.00
ATOM 200 H1 HOH 67 -5.391 -4.021 -7.836 1.00 0.00
ATOM 201 H2 HOH 67 -6.856 -3.905 -7.407 1.00 0.00
ATOM 202 O HOH 68 4.776 3.286 -0.543 1.00 0.00
ATOM 203 H1 HOH 68 4.503 3.668 -1.420 1.00 0.00
ATOM 204 H2 HOH 68 4.308 3.804 0.151 1.00 0.00
ATOM 205 O HOH 69 1.810 1.667 -8.491 1.00 0.00
ATOM 206 H1 HOH 69 1.048 1.572 -9.074 1.00 0.00
ATOM 207 H2 HOH 69 1.737 0.971 -7.784 1.00 0.00
ATOM 208 O HOH 70 -6.984 8.521 4.996 1.00 0.00
ATOM 209 H1 HOH 70 -6.319 9.034 4.547 1.00 0.00
ATOM 210 H2 HOH 70 -6.786 7.567 5.127 1.00 0.00
ATOM 211 O HOH 71 8.036 -7.667 5.624 1.00 0.00
ATOM 212 H1 HOH 71 8.944 -7.942 5.438 1.00 0.00
ATOM 213 H2 HOH 71 8.006 -7.115 6.374 1.00 0.00
ATOM 214 O HOH 72 -2.369 4.402 2.749 1.00 0.00
ATOM 215 H1 HOH 72 -2.101 4.193 3.659 1.00 0.00
ATOM 216 H2 HOH 72 -3.291 4.630 2.773 1.00 0.00
ATOM 217 O HOH 73 7.332 0.910 8.635 1.00 0.00
ATOM 218 H1 HOH 73 6.493 0.534 8.784 1.00 0.00
ATOM 219 H2 HOH 73 7.141 1.869 8.632 1.00 0.00
ATOM 220 O HOH 74 0.369 1.474 4.008 1.00 0.00
ATOM 221 H1 HOH 74 -0.105 1.445 4.853 1.00 0.00
ATOM 222 H2 HOH 74 -0.369 1.533 3.336 1.00 0.00
ATOM 223 O HOH 75 5.767 -9.208 5.731 1.00 0.00
ATOM 224 H1 HOH 75 5.445 -9.395 6.580 1.00 0.00
ATOM 225 H2 HOH 75 6.702 -8.805 5.685 1.00 0.00
ATOM 226 O HOH 76 4.162 -2.372 0.781 1.00 0.00
ATOM 227 H1 HOH 76 4.495 -2.247 1.647 1.00 0.00
ATOM 228 H2 HOH 76 3.609 -3.133 0.711 1.00 0.00
ATOM 229 O HOH 77 -1.983 -6.868 -7.665 1.00 0.00
ATOM 230 H1 HOH 77 -1.149 -6.836 -8.203 1.00 0.00
ATOM 231 H2 HOH 77 -2.094 -5.962 -7.318 1.00 0.00
ATOM 232 O HOH 78 -4.374 -7.889 1.779 1.00 0.00
ATOM 233 H1 HOH 78 -3.642 -7.300 1.538 1.00 0.00
ATOM 234 H2 HOH 78 -5.071 -7.407 1.392 1.00 0.00
ATOM 235 O HOH 79 5.161 6.852 4.554 1.00 0.00
ATOM 236 H1 HOH 79 5.392 7.675 4.897 1.00 0.00
ATOM 237 H2 HOH 79 5.444 6.815 3.631 1.00 0.00
ATOM 238 O HOH 80 -9.138 9.041 -8.058 1.00 0.00
ATOM 239 H1 HOH 80 -8.630 9.855 -7.946 1.00 0.00
ATOM 240 H2 HOH 80 -9.127 8.772 -9.011 1.00 0.00
ATOM 241 O HOH 81 -5.687 -0.393 5.354 1.00 0.00
ATOM 242 H1 HOH 81 -6.067 0.366 4.992 1.00 0.00
ATOM 243 H2 HOH 81 -5.831 -0.447 6.338 1.00 0.00
ATOM 244 O HOH 82 1.031 2.281 0.575 1.00 0.00
ATOM 245 H1 HOH 82 0.182 2.216 1.029 1.00 0.00
ATOM 246 H2 HOH 82 1.469 3.073 0.944 1.00 0.00
ATOM 247 O HOH 83 -5.344 -9.069 -7.701 1.00 0.00
ATOM 248 H1 HOH 83 -6.076 -8.559 -8.046 1.00 0.00
ATOM 249 H2 HOH 83 -5.531 -9.974 -8.022 1.00 0.00
ATOM 250 O HOH 84 1.744 -4.694 -7.741 1.00 0.00
ATOM 251 H1 HOH 84 1.332 -4.686 -6.836 1.00 0.00
ATOM 252 H2 HOH 84 2.349 -3.997 -7.787 1.00 0.00
ATOM 253 O HOH 85 5.038 8.639 -6.175 1.00 0.00
ATOM 254 H1 HOH 85 5.785 9.177 -6.374 1.00 0.00
ATOM 255 H2 HOH 85 5.210 8.228 -5.345 1.00 0.00
ATOM 256 O HOH 86 -0.023 8.844 -3.570 1.00 0.00
ATOM 257 H1 HOH 86 -0.459 9.203 -4.426 1.00 0.00
ATOM 258 H2 HOH 86 0.776 8.381 -3.782 1.00 0.00
ATOM 259 O HOH 87 -1.668 -9.035 -5.632 1.00 0.00
ATOM 260 H1 HOH 87 -1.508 -8.745 -6.515 1.00 0.00
ATOM 261 H2 HOH 87 -2.505 -8.575 -5.447 1.00 0.00
ATOM 262 O HOH 88 -1.025 -4.139 2.924 1.00 0.00
ATOM 263 H1 HOH 88 -1.638 -3.581 3.380 1.00 0.00
ATOM 264 H2 HOH 88 -0.344 -4.419 3.603 1.00 0.00
ATOM 265 O HOH 89 6.772 -9.275 -0.062 1.00 0.00
ATOM 266 H1 HOH 89 6.321 -8.407 0.016 1.00 0.00
ATOM 267 H2 HOH 89 7.220 -9.351 0.768 1.00 0.00
ATOM 268 O HOH 90 -5.260 5.074 2.814 1.00 0.00
ATOM 269 H1 HOH 90 -5.317 5.651 2.001 1.00 0.00
ATOM 270 H2 HOH 90 -5.953 4.419 2.667 1.00 0.00
ATOM 271 O HOH 91 0.439 -7.109 -3.006 1.00 0.00
ATOM 272 H1 HOH 91 0.122 -6.760 -2.168 1.00 0.00
ATOM 273 H2 HOH 91 0.300 -8.047 -3.005 1.00 0.00
ATOM 274 O HOH 92 4.754 0.068 -8.893 1.00 0.00
ATOM 275 H1 HOH 92 4.497 -0.819 -8.504 1.00 0.00
ATOM 276 H2 HOH 92 3.924 0.546 -9.098 1.00 0.00
ATOM 277 O HOH 93 8.453 -3.238 4.470 1.00 0.00
ATOM 278 H1 HOH 93 8.534 -2.386 4.151 1.00 0.00
ATOM 279 H2 HOH 93 9.380 -3.622 4.525 1.00 0.00
ATOM 280 O HOH 94 -8.562 -3.354 -5.396 1.00 0.00
ATOM 281 H1 HOH 94 -8.983 -3.218 -6.264 1.00 0.00
ATOM 282 H2 HOH 94 -7.657 -3.008 -5.367 1.00 0.00
ATOM 283 O HOH 95 -4.087 -7.007 9.259 1.00 0.00
ATOM 284 H1 HOH 95 -4.504 -7.764 9.701 1.00 0.00
ATOM 285 H2 HOH 95 -3.209 -6.941 9.653 1.00 0.00
ATOM 286 O HOH 96 -2.961 2.902 -4.614 1.00 0.00
ATOM 287 H1 HOH 96 -3.009 1.975 -4.316 1.00 0.00
ATOM 288 H2 HOH 96 -2.450 3.376 -3.907 1.00 0.00
ATOM 289 O HOH 97 -8.496 -3.305 0.422 1.00 0.00
ATOM 290 H1 HOH 97 -8.208 -3.909 1.155 1.00 0.00
ATOM 291 H2 HOH 97 -9.382 -3.162 0.529 1.00 0.00
ATOM 292 O HOH 98 -8.646 7.535 1.955 1.00 0.00
ATOM 293 H1 HOH 98 -9.207 6.758 1.900 1.00 0.00
ATOM 294 H2 HOH 98 -8.931 7.852 2.808 1.00 0.00
ATOM 295 O HOH 99 5.325 0.684 -1.143 1.00 0.00
ATOM 296 H1 HOH 99 6.163 0.574 -0.698 1.00 0.00
ATOM 297 H2 HOH 99 4.928 1.523 -0.792 1.00 0.00
ATOM 298 O HOH 100 -0.302 3.603 -9.202 1.00 0.00
ATOM 299 H1 HOH 100 0.254 4.336 -9.458 1.00 0.00
ATOM 300 H2 HOH 100 -0.128 3.520 -8.233 1.00 0.00
ATOM 301 O HOH 101 -7.609 -7.414 -7.642 1.00 0.00
ATOM 302 H1 HOH 101 -7.583 -6.832 -8.402 1.00 0.00
ATOM 303 H2 HOH 101 -7.817 -6.856 -6.873 1.00 0.00
ATOM 304 O HOH 102 -7.162 -0.866 -7.830 1.00 0.00
ATOM 305 H1 HOH 102 -6.916 -1.664 -7.366 1.00 0.00
ATOM 306 H2 HOH 102 -8.117 -0.865 -7.738 1.00 0.00
ATOM 307 O HOH 103 8.628 -2.873 -7.501 1.00 0.00
ATOM 308 H1 HOH 103 8.430 -2.014 -7.969 1.00 0.00
ATOM 309 H2 HOH 103 7.755 -3.342 -7.575 1.00 0.00
ATOM 310 O HOH 104 0.296 -6.725 -9.137 1.00 0.00
ATOM 311 H1 HOH 104 0.011 -6.271 -9.953 1.00 0.00
ATOM 312 H2 HOH 104 0.802 -5.981 -8.711 1.00 0.00
ATOM 313 O HOH 105 -2.283 4.666 7.799 1.00 0.00
ATOM 314 H1 HOH 105 -2.473 5.640 7.876 1.00 0.00
ATOM 315 H2 HOH 105 -1.790 4.332 8.562 1.00 0.00
ATOM 316 O HOH 106 -5.132 -2.648 0.721 1.00 0.00
ATOM 317 H1 HOH 106 -4.418 -2.848 1.417 1.00 0.00
ATOM 318 H2 HOH 106 -5.583 -3.451 0.568 1.00 0.00
ATOM 319 O HOH 107 3.597 -7.110 -8.571 1.00 0.00
ATOM 320 H1 HOH 107 3.557 -6.612 -7.707 1.00 0.00
ATOM 321 H2 HOH 107 2.931 -6.774 -9.116 1.00 0.00
ATOM 322 O HOH 108 -8.608 -8.319 3.526 1.00 0.00
ATOM 323 H1 HOH 108 -7.992 -8.997 3.888 1.00 0.00
ATOM 324 H2 HOH 108 -8.438 -8.243 2.566 1.00 0.00
ATOM 325 O HOH 109 -6.941 8.524 -4.898 1.00 0.00
ATOM 326 H1 HOH 109 -6.037 8.201 -4.795 1.00 0.00
ATOM 327 H2 HOH 109 -6.826 9.016 -5.706 1.00 0.00
ATOM 328 O HOH 110 -8.618 2.117 0.328 1.00 0.00
ATOM 329 H1 HOH 110 -9.507 2.587 0.268 1.00 0.00
ATOM 330 H2 HOH 110 -8.802 1.370 0.915 1.00 0.00
ATOM 331 O HOH 111 -6.703 -7.096 5.720 1.00 0.00
ATOM 332 H1 HOH 111 -6.345 -7.797 5.144 1.00 0.00
ATOM 333 H2 HOH 111 -7.115 -7.623 6.408 1.00 0.00
ATOM 334 O HOH 112 -4.243 1.635 -7.536 1.00 0.00
ATOM 335 H1 HOH 112 -3.372 1.373 -7.866 1.00 0.00
ATOM 336 H2 HOH 112 -4.520 2.387 -8.161 1.00 0.00
ATOM 337 O HOH 113 -4.209 -8.163 -5.306 1.00 0.00
ATOM 338 H1 HOH 113 -4.273 -7.181 -5.411 1.00 0.00
ATOM 339 H2 HOH 113 -4.501 -8.381 -6.200 1.00 0.00
ATOM 340 O HOH 114 6.037 3.308 -8.447 1.00 0.00
ATOM 341 H1 HOH 114 5.046 3.370 -8.401 1.00 0.00
ATOM 342 H2 HOH 114 6.249 2.483 -8.061 1.00 0.00
ATOM 343 O HOH 115 1.855 -0.633 0.513 1.00 0.00
ATOM 344 H1 HOH 115 2.810 -0.778 0.512 1.00 0.00
ATOM 345 H2 HOH 115 1.713 0.210 0.906 1.00 0.00
ATOM 346 O HOH 116 -0.350 -0.799 -3.447 1.00 0.00
ATOM 347 H1 HOH 116 -0.639 -0.602 -2.521 1.00 0.00
ATOM 348 H2 HOH 116 -0.468 -1.735 -3.577 1.00 0.00
ATOM 349 O HOH 117 2.557 6.236 4.285 1.00 0.00
ATOM 350 H1 HOH 117 1.909 6.451 4.910 1.00 0.00
ATOM 351 H2 HOH 117 3.454 6.494 4.590 1.00 0.00
ATOM 352 O HOH 118 -7.374 -8.763 -2.641 1.00 0.00
ATOM 353 H1 HOH 118 -7.322 -9.154 -3.510 1.00 0.00
ATOM 354 H2 HOH 118 -7.997 -9.286 -2.168 1.00 0.00
ATOM 355 O HOH 119 5.102 -2.717 7.917 1.00 0.00
ATOM 356 H1 HOH 119 5.105 -2.075 7.214 1.00 0.00
ATOM 357 H2 HOH 119 5.997 -3.082 7.930 1.00 0.00
ATOM 358 O HOH 120 0.617 -6.049 -5.430 1.00 0.00
ATOM 359 H1 HOH 120 0.065 -6.639 -5.953 1.00 0.00
ATOM 360 H2 HOH 120 0.625 -6.347 -4.518 1.00 0.00
ATOM 361 O HOH 121 -5.018 6.814 -8.879 1.00 0.00
ATOM 362 H1 HOH 121 -4.047 6.554 -8.848 1.00 0.00
ATOM 363 H2 HOH 121 -5.495 6.325 -8.167 1.00 0.00
ATOM 364 O HOH 122 -3.571 8.179 1.037 1.00 0.00
ATOM 365 H1 HOH 122 -4.358 7.666 0.884 1.00 0.00
ATOM 366 H2 HOH 122 -3.813 9.131 1.289 1.00 0.00
ATOM 367 O HOH 123 -1.089 6.429 -1.100 1.00 0.00
ATOM 368 H1 HOH 123 -0.958 6.512 -0.129 1.00 0.00
ATOM 369 H2 HOH 123 -1.425 7.353 -1.265 1.00 0.00
ATOM 370 O HOH 124 -8.068 3.899 -9.306 1.00 0.00
ATOM 371 H1 HOH 124 -8.429 4.769 -9.587 1.00 0.00
ATOM 372 H2 HOH 124 -7.407 4.106 -8.627 1.00 0.00
ATOM 373 O HOH 125 -7.322 -0.835 1.865 1.00 0.00
ATOM 374 H1 HOH 125 -6.633 -0.258 1.516 1.00 0.00
ATOM 375 H2 HOH 125 -7.594 -1.468 1.181 1.00 0.00
ATOM 376 O HOH 126 6.137 -3.751 -2.944 1.00 0.00
ATOM 377 H1 HOH 126 5.314 -3.197 -2.837 1.00 0.00
ATOM 378 H2 HOH 126 6.747 -3.054 -3.268 1.00 0.00
ATOM 379 O HOH 127 2.833 7.012 0.636 1.00 0.00
ATOM 380 H1 HOH 127 2.330 7.844 0.881 1.00 0.00
ATOM 381 H2 HOH 127 2.160 6.335 0.437 1.00 0.00
ATOM 382 O HOH 128 3.405 -5.843 -5.838 1.00 0.00
ATOM 383 H1 HOH 128 4.240 -5.687 -5.479 1.00 0.00
ATOM 384 H2 HOH 128 2.799 -5.627 -5.149 1.00 0.00
ATOM 385 O HOH 129 4.865 3.938 -5.085 1.00 0.00
ATOM 386 H1 HOH 129 4.895 2.983 -5.154 1.00 0.00
ATOM 387 H2 HOH 129 5.751 4.278 -4.809 1.00 0.00
ATOM 388 O HOH 130 -4.993 -8.656 4.141 1.00 0.00
ATOM 389 H1 HOH 130 -4.097 -9.036 4.154 1.00 0.00
ATOM 390 H2 HOH 130 -5.019 -8.186 3.285 1.00 0.00
ATOM 391 O HOH 131 -9.292 -0.951 7.718 1.00 0.00
ATOM 392 H1 HOH 131 -10.069 -0.492 8.136 1.00 0.00
ATOM 393 H2 HOH 131 -8.538 -0.352 7.799 1.00 0.00
ATOM 394 O HOH 132 5.820 -2.735 3.218 1.00 0.00
ATOM 395 H1 HOH 132 5.911 -2.123 3.919 1.00 0.00
ATOM 396 H2 HOH 132 6.270 -3.544 3.552 1.00 0.00
ATOM 397 O HOH 133 -4.387 7.103 -3.444 1.00 0.00
ATOM 398 H1 HOH 133 -3.580 6.680 -3.829 1.00 0.00
ATOM 399 H2 HOH 133 -3.958 7.858 -3.002 1.00 0.00
ATOM 400 O HOH 134 3.032 2.055 3.352 1.00 0.00
ATOM 401 H1 HOH 134 2.047 2.003 3.380 1.00 0.00
ATOM 402 H2 HOH 134 3.178 2.614 4.097 1.00 0.00
ATOM 403 O HOH 135 7.314 1.186 2.187 1.00 0.00
ATOM 404 H1 HOH 135 6.925 2.076 2.385 1.00 0.00
ATOM 405 H2 HOH 135 7.425 1.106 1.167 1.00 0.00
ATOM 406 O HOH 136 3.077 -6.778 -0.693 1.00 0.00
ATOM 407 H1 HOH 136 3.016 -7.565 -1.263 1.00 0.00
ATOM 408 H2 HOH 136 3.761 -6.920 -0.021 1.00 0.00
ATOM 409 O HOH 137 0.482 1.499 -4.856 1.00 0.00
ATOM 410 H1 HOH 137 0.708 1.788 -4.008 1.00 0.00
ATOM 411 H2 HOH 137 -0.146 0.779 -4.804 1.00 0.00
ATOM 412 O HOH 138 2.657 -0.480 -3.924 1.00 0.00
ATOM 413 H1 HOH 138 2.571 -0.270 -4.891 1.00 0.00
ATOM 414 H2 HOH 138 1.808 -0.171 -3.595 1.00 0.00
ATOM 415 O HOH 139 7.359 3.219 0.063 1.00 0.00
ATOM 416 H1 HOH 139 7.531 3.124 -0.908 1.00 0.00
ATOM 417 H2 HOH 139 6.413 3.324 0.053 1.00 0.00
ATOM 418 O HOH 140 -0.072 -2.194 -6.704 1.00 0.00
ATOM 419 H1 HOH 140 -0.799 -2.260 -7.333 1.00 0.00
ATOM 420 H2 HOH 140 -0.033 -2.956 -6.170 1.00 0.00
ATOM 421 O HOH 141 8.018 3.334 -2.584 1.00 0.00
ATOM 422 H1 HOH 141 8.927 3.176 -2.999 1.00 0.00
ATOM 423 H2 HOH 141 7.714 4.088 -3.149 1.00 0.00
ATOM 424 O HOH 142 -3.175 0.372 5.085 1.00 0.00
ATOM 425 H1 HOH 142 -3.328 1.279 5.414 1.00 0.00
ATOM 426 H2 HOH 142 -4.044 -0.022 5.216 1.00 0.00
ATOM 427 O HOH 143 7.709 -1.775 -4.109 1.00 0.00
ATOM 428 H1 HOH 143 8.092 -0.993 -3.608 1.00 0.00
ATOM 429 H2 HOH 143 8.479 -2.226 -4.429 1.00 0.00
ATOM 430 O HOH 144 -5.099 6.527 5.166 1.00 0.00
ATOM 431 H1 HOH 144 -4.189 6.950 5.093 1.00 0.00
ATOM 432 H2 HOH 144 -5.207 6.061 4.289 1.00 0.00
ATOM 433 O HOH 145 8.893 -0.159 -7.906 1.00 0.00
ATOM 434 H1 HOH 145 8.405 0.225 -7.122 1.00 0.00
ATOM 435 H2 HOH 145 8.639 0.460 -8.570 1.00 0.00
ATOM 436 O HOH 146 -4.263 -5.454 -5.270 1.00 0.00
ATOM 437 H1 HOH 146 -3.405 -5.209 -5.564 1.00 0.00
ATOM 438 H2 HOH 146 -4.911 -5.251 -5.952 1.00 0.00
ATOM 439 O HOH 147 8.883 7.851 4.742 1.00 0.00
ATOM 440 H1 HOH 147 9.674 8.080 5.221 1.00 0.00
ATOM 441 H2 HOH 147 8.345 7.269 5.297 1.00 0.00
ATOM 442 O HOH 148 -0.309 -5.404 -0.774 1.00 0.00
ATOM 443 H1 HOH 148 0.249 -4.705 -0.532 1.00 0.00
ATOM 444 H2 HOH 148 -1.094 -5.121 -1.264 1.00 0.00
ATOM 445 O HOH 149 5.072 -8.090 3.321 1.00 0.00
ATOM 446 H1 HOH 149 5.125 -8.433 4.296 1.00 0.00
ATOM 447 H2 HOH 149 4.846 -7.155 3.366 1.00 0.00
ATOM 448 O HOH 150 0.710 -8.627 -7.212 1.00 0.00
ATOM 449 H1 HOH 150 0.882 -8.127 -7.970 1.00 0.00
ATOM 450 H2 HOH 150 1.486 -8.744 -6.660 1.00 0.00
ATOM 451 O HOH 151 -2.726 8.212 4.098 1.00 0.00
ATOM 452 H1 HOH 151 -1.889 7.861 4.444 1.00 0.00
ATOM 453 H2 HOH 151 -2.726 8.156 3.075 1.00 0.00
ATOM 454 O HOH 152 -2.367 7.081 9.006 1.00 0.00
ATOM 455 H1 HOH 152 -1.709 7.028 9.733 1.00 0.00
ATOM 456 H2 HOH 152 -2.233 8.060 8.705 1.00 0.00
ATOM 457 O HOH 153 6.090 -5.347 -5.159 1.00 0.00
ATOM 458 H1 HOH 153 6.663 -6.118 -4.931 1.00 0.00
ATOM 459 H2 HOH 153 6.130 -4.741 -4.369 1.00 0.00
ATOM 460 O HOH 154 -6.943 5.559 -7.275 1.00 0.00
ATOM 461 H1 HOH 154 -6.852 5.143 -6.441 1.00 0.00
ATOM 462 H2 HOH 154 -7.722 6.088 -7.135 1.00 0.00
ATOM 463 O HOH 155 -6.554 5.680 7.665 1.00 0.00
ATOM 464 H1 HOH 155 -5.985 5.815 6.863 1.00 0.00
ATOM 465 H2 HOH 155 -6.073 6.260 8.297 1.00 0.00
ATOM 466 O HOH 156 -1.773 -7.513 4.829 1.00 0.00
ATOM 467 H1 HOH 156 -1.111 -7.160 4.268 1.00 0.00
ATOM 468 H2 HOH 156 -1.281 -8.206 5.239 1.00 0.00
ATOM 469 O HOH 157 5.088 -1.778 -5.553 1.00 0.00
ATOM 470 H1 HOH 157 4.758 -1.676 -4.673 1.00 0.00
ATOM 471 H2 HOH 157 6.001 -1.657 -5.464 1.00 0.00
ATOM 472 O HOH 158 7.974 -0.053 -0.228 1.00 0.00
ATOM 473 H1 HOH 158 7.544 -0.925 -0.027 1.00 0.00
ATOM 474 H2 HOH 158 8.404 -0.258 -1.091 1.00 0.00
ATOM 475 O HOH 159 2.481 -4.518 -2.565 1.00 0.00
ATOM 476 H1 HOH 159 2.654 -5.131 -1.870 1.00 0.00
ATOM 477 H2 HOH 159 2.866 -3.653 -2.218 1.00 0.00
ATOM 478 O HOH 160 8.941 6.414 -2.284 1.00 0.00
ATOM 479 H1 HOH 160 8.639 5.765 -2.912 1.00 0.00
ATOM 480 H2 HOH 160 9.870 6.369 -2.209 1.00 0.00
ATOM 481 O HOH 161 -5.030 3.860 -9.133 1.00 0.00
ATOM 482 H1 HOH 161 -4.276 4.457 -8.996 1.00 0.00
ATOM 483 H2 HOH 161 -5.711 4.362 -9.608 1.00 0.00
ATOM 484 O HOH 162 -5.791 3.147 -1.317 1.00 0.00
ATOM 485 H1 HOH 162 -6.436 2.378 -1.382 1.00 0.00
ATOM 486 H2 HOH 162 -5.191 2.984 -0.504 1.00 0.00
ATOM 487 O HOH 163 -2.329 -4.533 -2.630 1.00 0.00
ATOM 488 H1 HOH 163 -3.171 -5.058 -2.576 1.00 0.00
ATOM 489 H2 HOH 163 -2.499 -3.672 -2.246 1.00 0.00
ATOM 490 O HOH 164 7.390 6.060 8.753 1.00 0.00
ATOM 491 H1 HOH 164 6.851 5.658 8.039 1.00 0.00
ATOM 492 H2 HOH 164 6.789 6.249 9.485 1.00 0.00
ATOM 493 O HOH 165 -1.734 -4.483 -6.269 1.00 0.00
ATOM 494 H1 HOH 165 -1.212 -4.704 -5.518 1.00 0.00
ATOM 495 H2 HOH 165 -2.176 -3.710 -5.905 1.00 0.00
ATOM 496 O HOH 166 -0.979 4.105 5.515 1.00 0.00
ATOM 497 H1 HOH 166 -1.509 4.308 6.292 1.00 0.00
ATOM 498 H2 HOH 166 -0.221 3.585 5.863 1.00 0.00
ATOM 499 O HOH 167 -2.925 4.250 -7.055 1.00 0.00
ATOM 500 H1 HOH 167 -2.386 3.828 -7.713 1.00 0.00
ATOM 501 H2 HOH 167 -2.854 3.619 -6.304 1.00 0.00
ATOM 502 O HOH 168 -4.193 -1.077 -8.101 1.00 0.00
ATOM 503 H1 HOH 168 -4.551 -1.839 -8.506 1.00 0.00
ATOM 504 H2 HOH 168 -4.698 -0.329 -8.425 1.00 0.00
ATOM 505 O HOH 169 -8.302 -5.937 -5.244 1.00 0.00
ATOM 506 H1 HOH 169 -8.357 -5.005 -5.460 1.00 0.00
ATOM 507 H2 HOH 169 -7.765 -5.968 -4.487 1.00 0.00
ATOM 508 O HOH 170 0.475 2.499 7.103 1.00 0.00
ATOM 509 H1 HOH 170 0.053 2.668 8.005 1.00 0.00
ATOM 510 H2 HOH 170 0.928 1.639 7.275 1.00 0.00
ATOM 511 O HOH 171 0.983 -2.483 6.222 1.00 0.00
ATOM 512 H1 HOH 171 0.714 -2.387 7.103 1.00 0.00
ATOM 513 H2 HOH 171 1.073 -3.395 5.953 1.00 0.00
ATOM 514 O HOH 172 -1.739 6.386 -4.380 1.00 0.00
ATOM 515 H1 HOH 172 -1.086 7.088 -4.202 1.00 0.00
ATOM 516 H2 HOH 172 -1.618 5.678 -3.708 1.00 0.00
ATOM 517 O HOH 173 -8.338 -7.832 7.971 1.00 0.00
ATOM 518 H1 HOH 173 -8.660 -8.718 7.769 1.00 0.00
ATOM 519 H2 HOH 173 -9.133 -7.191 7.981 1.00 0.00
ATOM 520 O HOH 174 3.012 4.410 1.775 1.00 0.00
ATOM 521 H1 HOH 174 3.088 3.596 2.267 1.00 0.00
ATOM 522 H2 HOH 174 2.920 5.066 2.466 1.00 0.00
ATOM 523 O HOH 175 3.835 -2.844 -8.396 1.00 0.00
ATOM 524 H1 HOH 175 4.123 -2.941 -9.341 1.00 0.00
ATOM 525 H2 HOH 175 4.550 -3.355 -7.864 1.00 0.00
ATOM 526 O HOH 176 5.454 1.225 -4.087 1.00 0.00
ATOM 527 H1 HOH 176 6.075 1.634 -3.481 1.00 0.00
ATOM 528 H2 HOH 176 4.836 0.886 -3.441 1.00 0.00
ATOM 529 O HOH 177 1.364 -3.319 1.034 1.00 0.00
ATOM 530 H1 HOH 177 1.576 -2.519 1.568 1.00 0.00
ATOM 531 H2 HOH 177 0.786 -3.846 1.612 1.00 0.00
ATOM 532 O HOH 178 8.425 3.808 -6.918 1.00 0.00
ATOM 533 H1 HOH 178 9.075 3.928 -7.729 1.00 0.00
ATOM 534 H2 HOH 178 7.505 3.888 -7.275 1.00 0.00
ATOM 535 O HOH 179 2.777 -8.590 -5.314 1.00 0.00
ATOM 536 H1 HOH 179 2.839 -7.702 -5.632 1.00 0.00
ATOM 537 H2 HOH 179 3.489 -9.124 -5.685 1.00 0.00
ATOM 538 O HOH 180 2.682 -7.850 6.993 1.00 0.00
ATOM 539 H1 HOH 180 3.382 -8.376 7.384 1.00 0.00
ATOM 540 H2 HOH 180 3.009 -6.910 7.029 1.00 0.00
ATOM 541 O HOH 181 0.959 5.976 8.842 1.00 0.00
ATOM 542 H1 HOH 181 1.908 5.889 8.681 1.00 0.00
ATOM 543 H2 HOH 181 0.701 6.300 9.762 1.00 0.00
ATOM 544 O HOH 182 -3.269 -0.095 2.168 1.00 0.00
ATOM 545 H1 HOH 182 -3.261 -0.142 3.146 1.00 0.00
ATOM 546 H2 HOH 182 -2.758 -0.845 1.881 1.00 0.00
ATOM 547 O HOH 183 -8.343 -5.520 2.186 1.00 0.00
ATOM 548 H1 HOH 183 -8.240 -5.469 3.127 1.00 0.00
ATOM 549 H2 HOH 183 -9.326 -5.545 1.936 1.00 0.00
ATOM 550 O HOH 184 -3.748 2.251 7.121 1.00 0.00
ATOM 551 H1 HOH 184 -4.751 2.368 7.191 1.00 0.00
ATOM 552 H2 HOH 184 -3.334 3.091 7.210 1.00 0.00
ATOM 553 O HOH 185 5.491 -6.805 0.724 1.00 0.00
ATOM 554 H1 HOH 185 6.053 -6.670 1.517 1.00 0.00
ATOM 555 H2 HOH 185 5.861 -6.118 0.175 1.00 0.00
ATOM 556 O HOH 186 -2.313 9.029 -1.341 1.00 0.00
ATOM 557 H1 HOH 186 -2.862 9.567 -1.983 1.00 0.00
ATOM 558 H2 HOH 186 -2.931 8.715 -0.682 1.00 0.00
ATOM 559 O HOH 187 -5.479 0.699 0.492 1.00 0.00
ATOM 560 H1 HOH 187 -4.847 0.137 0.967 1.00 0.00
ATOM 561 H2 HOH 187 -5.594 0.350 -0.404 1.00 0.00
ATOM 562 O HOH 188 -4.084 -6.161 5.301 1.00 0.00
ATOM 563 H1 HOH 188 -3.506 -6.799 4.940 1.00 0.00
ATOM 564 H2 HOH 188 -4.630 -6.788 5.863 1.00 0.00
ATOM 565 O HOH 189 4.659 7.875 -1.282 1.00 0.00
ATOM 566 H1 HOH 189 5.386 8.309 -0.774 1.00 0.00
ATOM 567 H2 HOH 189 4.055 7.498 -0.619 1.00 0.00
ATOM 568 O HOH 190 -0.166 -3.706 -3.657 1.00 0.00
ATOM 569 H1 HOH 190 -0.908 -4.138 -3.272 1.00 0.00
ATOM 570 H2 HOH 190 0.514 -4.377 -3.440 1.00 0.00
ATOM 571 O HOH 191 -5.951 0.171 -2.277 1.00 0.00
ATOM 572 H1 HOH 191 -5.823 0.714 -3.060 1.00 0.00
ATOM 573 H2 HOH 191 -6.282 -0.633 -2.620 1.00 0.00
ATOM 574 O HOH 192 -4.764 -4.232 8.960 1.00 0.00
ATOM 575 H1 HOH 192 -5.480 -4.134 8.313 1.00 0.00
ATOM 576 H2 HOH 192 -4.642 -5.206 8.983 1.00 0.00
ATOM 577 O HOH 193 0.145 -8.934 -0.348 1.00 0.00
ATOM 578 H1 HOH 193 -0.693 -9.106 -0.806 1.00 0.00
ATOM 579 H2 HOH 193 0.881 -9.152 -0.962 1.00 0.00
ATOM 580 O HOH 194 -6.024 6.817 0.677 1.00 0.00
ATOM 581 H1 HOH 194 -6.335 6.594 -0.147 1.00 0.00
ATOM 582 H2 HOH 194 -6.795 7.026 1.255 1.00 0.00
ATOM 583 O HOH 195 -7.976 -4.857 -8.808 1.00 0.00
ATOM 584 H1 HOH 195 -7.659 -4.428 -9.586 1.00 0.00
ATOM 585 H2 HOH 195 -8.826 -4.435 -8.650 1.00 0.00
ATOM 586 O HOH 196 6.091 7.506 -3.794 1.00 0.00
ATOM 587 H1 HOH 196 6.896 8.024 -3.504 1.00 0.00
ATOM 588 H2 HOH 196 5.535 7.536 -2.967 1.00 0.00
ATOM 589 O HOH 197 7.449 5.304 -4.471 1.00 0.00
ATOM 590 H1 HOH 197 7.018 6.181 -4.365 1.00 0.00
ATOM 591 H2 HOH 197 8.016 5.286 -5.241 1.00 0.00
ATOM 592 O HOH 198 -6.900 -5.901 -2.927 1.00 0.00
ATOM 593 H1 HOH 198 -7.154 -6.838 -2.857 1.00 0.00
ATOM 594 H2 HOH 198 -5.932 -5.822 -2.739 1.00 0.00
ATOM 595 O HOH 199 -2.077 -9.026 8.256 1.00 0.00
ATOM 596 H1 HOH 199 -1.233 -9.035 7.789 1.00 0.00
ATOM 597 H2 HOH 199 -2.467 -8.111 8.140 1.00 0.00
ATOM 598 O HOH 200 -5.977 -2.535 3.782 1.00 0.00
ATOM 599 H1 HOH 200 -5.780 -1.850 4.378 1.00 0.00
ATOM 600 H2 HOH 200 -6.306 -1.917 3.065 1.00 0.00
ATOM 601 O HOH 201 2.576 -9.098 -2.268 1.00 0.00
ATOM 602 H1 HOH 201 3.391 -9.612 -2.195 1.00 0.00
ATOM 603 H2 HOH 201 2.529 -8.810 -3.194 1.00 0.00
ATOM 604 O HOH 202 -5.798 4.562 -4.805 1.00 0.00
ATOM 605 H1 HOH 202 -5.028 4.024 -4.763 1.00 0.00
ATOM 606 H2 HOH 202 -5.523 5.503 -4.645 1.00 0.00
ATOM 607 O HOH 203 2.642 3.615 5.573 1.00 0.00
ATOM 608 H1 HOH 203 1.851 3.465 6.145 1.00 0.00
ATOM 609 H2 HOH 203 2.533 4.499 5.175 1.00 0.00
ATOM 610 O HOH 204 8.011 -7.394 -4.619 1.00 0.00
ATOM 611 H1 HOH 204 8.169 -7.901 -3.820 1.00 0.00
ATOM 612 H2 HOH 204 8.830 -6.924 -4.810 1.00 0.00
ATOM 613 O HOH 205 -5.863 0.151 -5.281 1.00 0.00
ATOM 614 H1 HOH 205 -5.088 0.587 -5.588 1.00 0.00
ATOM 615 H2 HOH 205 -6.450 0.191 -6.017 1.00 0.00
ATOM 616 O HOH 206 7.645 -5.999 2.880 1.00 0.00
ATOM 617 H1 HOH 206 7.086 -5.401 3.352 1.00 0.00
ATOM 618 H2 HOH 206 7.945 -6.726 3.484 1.00 0.00
ATOM 619 O HOH 207 -4.127 6.816 -6.252 1.00 0.00
ATOM 620 H1 HOH 207 -3.484 6.105 -6.419 1.00 0.00
ATOM 621 H2 HOH 207 -3.581 7.596 -6.033 1.00 0.00
ATOM 622 O HOH 208 -2.387 0.594 9.139 1.00 0.00
ATOM 623 H1 HOH 208 -2.910 -0.143 9.526 1.00 0.00
ATOM 624 H2 HOH 208 -2.860 1.041 8.365 1.00 0.00
ATOM 625 O HOH 209 6.291 -6.637 -8.831 1.00 0.00
ATOM 626 H1 HOH 209 5.331 -6.682 -8.839 1.00 0.00
ATOM 627 H2 HOH 209 6.669 -7.204 -8.167 1.00 0.00
ATOM 628 O HOH 210 2.510 -8.884 2.290 1.00 0.00
ATOM 629 H1 HOH 210 2.430 -8.169 1.697 1.00 0.00
ATOM 630 H2 HOH 210 3.446 -8.960 2.484 1.00 0.00
ATOM 631 O HOH 211 -9.142 8.039 7.883 1.00 0.00
ATOM 632 H1 HOH 211 -8.383 7.421 7.829 1.00 0.00
ATOM 633 H2 HOH 211 -9.916 7.561 8.297 1.00 0.00
ATOM 634 O HOH 212 7.971 -3.288 7.179 1.00 0.00
ATOM 635 H1 HOH 212 8.561 -2.572 7.494 1.00 0.00
ATOM 636 H2 HOH 212 7.985 -3.225 6.216 1.00 0.00
ATOM 637 O HOH 213 7.974 -6.006 7.682 1.00 0.00
ATOM 638 H1 HOH 213 8.211 -5.090 7.590 1.00 0.00
ATOM 639 H2 HOH 213 7.297 -6.051 8.386 1.00 0.00
ATOM 640 O HOH 214 -1.174 -5.931 7.038 1.00 0.00
ATOM 641 H1 HOH 214 -1.529 -6.552 6.343 1.00 0.00
ATOM 642 H2 HOH 214 -1.604 -5.078 6.850 1.00 0.00
ATOM 643 O HOH 215 5.857 3.613 3.066 1.00 0.00
ATOM 644 H1 HOH 215 5.145 4.238 2.616 1.00 0.00
ATOM 645 H2 HOH 215 5.360 3.257 3.827 1.00 0.00
ATOM 646 Ca Ca 216 -7.511 3.594 2.437 1.00 0.00
TER
ENDMDL
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment