Commit b665dfcb authored by peastman's avatar peastman
Browse files

Merge pull request #1083 from rmcgibbo/wip-single-23-codebase

Single py2/3 codebase
parents 69a3f678 83d0e5e3
language: cpp language: python
compiler: python:
- clang - "2.7_with_system_site_packages"
- "3.4"
sudo: false sudo: false
addons: addons:
apt: apt:
...@@ -10,16 +12,10 @@ addons: ...@@ -10,16 +12,10 @@ addons:
- libpcre3 - libpcre3
- libpcre3-dev - libpcre3-dev
- gromacs - gromacs
- swig
- doxygen - doxygen
- clang-3.3
- llvm-3.3
- python-numpy - python-numpy
- python-scipy - python-scipy
- python-sphinx
- python-yaml
- python-pip
- python-virtualenv
env: env:
matrix: matrix:
...@@ -29,11 +25,14 @@ env: ...@@ -29,11 +25,14 @@ env:
before_install: before_install:
- export CC=clang - export CC=clang
- export CXX=clang++ - export CXX=clang++
- export ASAN_SYMBOLIZER_PATH=/usr/bin/llvm-symbolizer-3.3
- wget https://anaconda.org/anaconda/swig/3.0.2/download/linux-64/swig-3.0.2-0.tar.bz2
- mkdir $HOME/swig
- tar -xjvf swig-3.0.2-0.tar.bz2 -C $HOME/swig
- export PATH=$HOME/swig/bin:$PATH
- export SWIG_LIB=$HOME/swig/share/swig/3.0.2
script: script:
- virtualenv --system-site-packages openmm_env
- source openmm_env/bin/activate
- cmake -DCMAKE_INSTALL_PREFIX=$HOME/OpenMM -DOPENMM_BUILD_STATIC_LIB=$OPENMM_BUILD_STATIC_LIB . - cmake -DCMAKE_INSTALL_PREFIX=$HOME/OpenMM -DOPENMM_BUILD_STATIC_LIB=$OPENMM_BUILD_STATIC_LIB .
- make -j2 - make -j2
- make -j2 install - make -j2 install
...@@ -43,11 +42,12 @@ script: ...@@ -43,11 +42,12 @@ script:
- # run all of the tests, making sure failures at this stage don't cause travis failures - # run all of the tests, making sure failures at this stage don't cause travis failures
- ctest -j2 || true - ctest -j2 || true
- # get a list of all of the failed tests into this stupid ctest format - # get a list of all of the failed tests into this stupid ctest format
- python -c 'fn = "Testing/Temporary/LastTestsFailed.log"; import os; os.path.exists(fn) or exit(0); l = [line.split(":")[0] for line in open(fn)]; triplets = zip(l, l, [","]*len(l)); print "".join(",".join(t) for t in triplets)' > FailedTests.log - python -c "import os; fn = os.path.join('Testing', 'Temporary', 'LastTestsFailed.log'); os.path.exists(fn) or exit(0); failed = [line.split(':')[0] for line in open(fn)]; print(','.join(x+','+x for x in failed))" > FailedTests.log
- # rerun all of the failed tests - # rerun all of the failed tests
- if [ -s Testing/Temporary/LastTestsFailed.log ]; then ctest -I FailedTests.log; fi; - if [ -s Testing/Temporary/LastTestsFailed.log ]; then ctest -I FailedTests.log; fi;
- # run the python tests too - # run the python tests too
- cd python/tests - cd python/tests
- pip install nose - # nosetests -vv --processes=-1 --process-timeout=200
- nosetests -vv --processes=-1 --process-timeout=200 - # nosetests -vv
- py.test -v *
- cd - - cd -
...@@ -122,11 +122,6 @@ def buildKeywordDictionary(major_version_num=MAJOR_VERSION_NUM, ...@@ -122,11 +122,6 @@ def buildKeywordDictionary(major_version_num=MAJOR_VERSION_NUM,
build_info=BUILD_INFO): build_info=BUILD_INFO):
from distutils.core import Extension from distutils.core import Extension
setupKeywords = {} setupKeywords = {}
try:
from distutils.command.build_py import build_py_2to3 as build_py
except ImportError:
from distutils.command.build_py import build_py
setupKeywords["cmdclass"] = {'build_py': build_py}
setupKeywords["name"] = "OpenMM" setupKeywords["name"] = "OpenMM"
setupKeywords["version"] = "%s.%s.%s" % (major_version_num, setupKeywords["version"] = "%s.%s.%s" % (major_version_num,
minor_version_num, minor_version_num,
......
...@@ -4,11 +4,12 @@ from your own code. It provides a combination of extreme flexibility ...@@ -4,11 +4,12 @@ from your own code. It provides a combination of extreme flexibility
(through custom forces and integrators), openness, and high performance (through custom forces and integrators), openness, and high performance
(especially on recent GPUs) that make it truly unique among simulation codes. (especially on recent GPUs) that make it truly unique among simulation codes.
""" """
from __future__ import absolute_import
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
import os, os.path import os, os.path
import sys import sys
from simtk.openmm import version from . import version
if sys.platform == 'win32': if sys.platform == 'win32':
_path = os.environ['PATH'] _path = os.environ['PATH']
......
...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
__version__ = "1.0" __version__ = "1.0"
......
...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
__version__ = "1.0" __version__ = "1.0"
......
...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
__version__ = "1.0" __version__ = "1.0"
...@@ -35,8 +36,8 @@ from math import sqrt ...@@ -35,8 +36,8 @@ from math import sqrt
from simtk.openmm.app import Topology from simtk.openmm.app import Topology
from simtk.openmm.app import PDBFile from simtk.openmm.app import PDBFile
from simtk.openmm.app.internal import amber_file_parser from simtk.openmm.app.internal import amber_file_parser
import forcefield as ff from . import forcefield as ff
import element as elem from . import element as elem
import simtk.unit as unit import simtk.unit as unit
import simtk.openmm as mm import simtk.openmm as mm
from simtk.openmm.app.internal.unitcell import computePeriodicBoxVectors from simtk.openmm.app.internal.unitcell import computePeriodicBoxVectors
......
...@@ -33,6 +33,8 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -33,6 +33,8 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
from __future__ import print_function
from simtk.openmm.app.internal.charmm.exceptions import CharmmFileError from simtk.openmm.app.internal.charmm.exceptions import CharmmFileError
import simtk.unit as u import simtk.unit as u
...@@ -117,7 +119,7 @@ class CharmmCrdFile(object): ...@@ -117,7 +119,7 @@ class CharmmCrdFile(object):
len(self.positions)) len(self.positions))
) )
except (ValueError, IndexError), e: except (ValueError, IndexError) as e:
raise CharmmFileError('Error parsing CHARMM coordinate file') raise CharmmFileError('Error parsing CHARMM coordinate file')
# Apply units to the positions now. Do it this way to allow for # Apply units to the positions now. Do it this way to allow for
...@@ -197,7 +199,7 @@ class CharmmRstFile(object): ...@@ -197,7 +199,7 @@ class CharmmRstFile(object):
self.jhstrt = int(line[5]) # Num total steps? self.jhstrt = int(line[5]) # Num total steps?
break break
except (ValueError, IndexError), e: except (ValueError, IndexError) as e:
raise CharmmFileError('Problem parsing CHARMM restart') raise CharmmFileError('Problem parsing CHARMM restart')
self._scan(crdfile, '!XOLD') self._scan(crdfile, '!XOLD')
...@@ -255,9 +257,9 @@ class CharmmRstFile(object): ...@@ -255,9 +257,9 @@ class CharmmRstFile(object):
def printcoords(self, crds): def printcoords(self, crds):
for crd in range(len(crds)): for crd in range(len(crds)):
print crds[crd], print(crds[crd], end=' ')
if not (crd+1) % 3: if not (crd+1) % 3:
print '\n', print('\n', end=' ')
if __name__ == '__main__': if __name__ == '__main__':
import doctest import doctest
......
...@@ -33,6 +33,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -33,6 +33,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
import os import os
from simtk.openmm.app.internal.charmm._charmmfile import ( from simtk.openmm.app.internal.charmm._charmmfile import (
CharmmFile, CharmmStreamFile) CharmmFile, CharmmStreamFile)
...@@ -428,7 +429,7 @@ class CharmmParameterSet(object): ...@@ -428,7 +429,7 @@ class CharmmParameterSet(object):
# soldier on # soldier on
if not read_first_nonbonded: continue if not read_first_nonbonded: continue
raise CharmmFileError('Could not parse nonbonded terms.') raise CharmmFileError('Could not parse nonbonded terms.')
except CharmmFileError, e: except CharmmFileError as e:
if not read_first_nonbonded: continue if not read_first_nonbonded: continue
raise CharmmFileError(str(e)) raise CharmmFileError(str(e))
else: else:
...@@ -587,7 +588,7 @@ class CharmmParameterSet(object): ...@@ -587,7 +588,7 @@ class CharmmParameterSet(object):
# multiterm dihedral have to have a DIFFERENT periodicity, we don't have # multiterm dihedral have to have a DIFFERENT periodicity, we don't have
# to condense _within_ a single list of torsions assigned to the same # to condense _within_ a single list of torsions assigned to the same
# key (they're guaranteed to be different) # key (they're guaranteed to be different)
keylist = self.dihedral_types.keys() keylist = list(self.dihedral_types.keys())
for i in range(len(keylist) - 1): for i in range(len(keylist) - 1):
key1 = keylist[i] key1 = keylist[i]
for dihedral in self.dihedral_types[key1]: for dihedral in self.dihedral_types[key1]:
...@@ -606,7 +607,7 @@ class CharmmParameterSet(object): ...@@ -606,7 +607,7 @@ class CharmmParameterSet(object):
Parameter: Parameter:
- typedict : Type dictionary to condense - typedict : Type dictionary to condense
""" """
keylist = typedict.keys() keylist = list(typedict.keys())
for i in range(len(keylist) - 1): for i in range(len(keylist) - 1):
key1 = keylist[i] key1 = keylist[i]
for j in range(i+1, len(keylist)): for j in range(i+1, len(keylist)):
......
...@@ -33,11 +33,14 @@ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE ...@@ -33,11 +33,14 @@ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import division from __future__ import division
from __future__ import absolute_import
from __future__ import print_function
from functools import wraps from functools import wraps
from math import pi, cos, sin, sqrt from math import pi, cos, sin, sqrt
import os import os
import re import re
import sys
import simtk.openmm as mm import simtk.openmm as mm
from simtk.openmm.vec3 import Vec3 from simtk.openmm.vec3 import Vec3
import simtk.unit as u import simtk.unit as u
...@@ -58,7 +61,8 @@ import warnings ...@@ -58,7 +61,8 @@ import warnings
TINY = 1e-8 TINY = 1e-8
WATNAMES = ('WAT', 'HOH', 'TIP3', 'TIP4', 'TIP5', 'SPCE', 'SPC') WATNAMES = ('WAT', 'HOH', 'TIP3', 'TIP4', 'TIP5', 'SPCE', 'SPC')
if sys.version_info >= (3, 0):
xrange = range
def _catchindexerror(func): def _catchindexerror(func):
""" """
...@@ -70,7 +74,7 @@ def _catchindexerror(func): ...@@ -70,7 +74,7 @@ def _catchindexerror(func):
""" Catch the index error """ """ Catch the index error """
try: try:
return func(*args, **kwargs) return func(*args, **kwargs)
except IndexError, e: except IndexError as e:
raise CharmmPSFError('Array is too short: %s' % e) raise CharmmPSFError('Array is too short: %s' % e)
return newfunc return newfunc
...@@ -386,8 +390,8 @@ class CharmmPsfFile(object): ...@@ -386,8 +390,8 @@ class CharmmPsfFile(object):
""" """
try: try:
return type(string) return type(string)
except ValueError, e: except ValueError as e:
print e print(e)
raise CharmmPSFError('Could not convert %s' % message) raise CharmmPSFError('Could not convert %s' % message)
@staticmethod @staticmethod
...@@ -1251,8 +1255,8 @@ class CharmmPsfFile(object): ...@@ -1251,8 +1255,8 @@ class CharmmPsfFile(object):
elif implicitSolvent is GBn2: elif implicitSolvent is GBn2:
gb = GBSAGBn2Force(solventDielectric, soluteDielectric, None, gb = GBSAGBn2Force(solventDielectric, soluteDielectric, None,
cutoff, kappa=implicitSolventKappa) cutoff, kappa=implicitSolventKappa)
for i, atom in enumerate(self.atom_list): for atom, gb_parm in zip(self.atom_list, gb_parms):
gb.addParticle([atom.charge] + list(gb_parms[i])) gb.addParticle([atom.charge] + list(gb_parm))
# Set cutoff method # Set cutoff method
if nonbondedMethod is ff.NoCutoff: if nonbondedMethod is ff.NoCutoff:
gb.setNonbondedMethod(mm.NonbondedForce.NoCutoff) gb.setNonbondedMethod(mm.NonbondedForce.NoCutoff)
......
...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Robert McGibbon" __author__ = "Robert McGibbon"
__version__ = "1.0" __version__ = "1.0"
...@@ -77,7 +78,7 @@ class CheckpointReporter(object): ...@@ -77,7 +78,7 @@ class CheckpointReporter(object):
""" """
self._reportInterval = reportInterval self._reportInterval = reportInterval
if isinstance(file, basestring): if isinstance(file, str):
self._own_handle = True self._own_handle = True
self._out = open(file, 'w+b', 0) self._out = open(file, 'w+b', 0)
else: else:
......
...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
__version__ = "1.0" __version__ = "1.0"
......
...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
__version__ = "1.0" __version__ = "1.0"
......
...@@ -24,6 +24,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -24,6 +24,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
import os import os
import math import math
......
...@@ -28,12 +28,18 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,12 +28,18 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Christopher M. Bruns" __author__ = "Christopher M. Bruns"
__version__ = "1.0" __version__ = "1.0"
import sys
from collections import OrderedDict from collections import OrderedDict
from simtk.unit import daltons, is_quantity from simtk.unit import daltons, is_quantity
import copy_reg if sys.version_info >= (3, 0):
import copyreg
else:
import copy_reg as copyreg
class Element(object): class Element(object):
"""An Element represents a chemical element. """An Element represents a chemical element.
...@@ -128,7 +134,7 @@ class Element(object): ...@@ -128,7 +134,7 @@ class Element(object):
diff = mass diff = mass
best_guess = None best_guess = None
for elemmass, element in Element._elements_by_mass.iteritems(): for elemmass, element in _iteritems(Element._elements_by_mass):
massdiff = abs(elemmass - mass) massdiff = abs(elemmass - mass)
if massdiff < diff: if massdiff < diff:
best_guess = element best_guess = element
...@@ -172,7 +178,7 @@ def get_by_symbol(symbol): ...@@ -172,7 +178,7 @@ def get_by_symbol(symbol):
def _pickle_element(element): def _pickle_element(element):
return (get_by_symbol, (element.symbol,)) return (get_by_symbol, (element.symbol,))
copy_reg.pickle(Element, _pickle_element) copyreg.pickle(Element, _pickle_element)
# NOTE: getElementByMass assumes all masses are Quantity instances with unit # NOTE: getElementByMass assumes all masses are Quantity instances with unit
# "daltons". All elements need to obey this assumption, or that method will # "daltons". All elements need to obey this assumption, or that method will
...@@ -299,3 +305,10 @@ ununhexium = Element(116, "ununhexium", "Uuh", 292*daltons) ...@@ -299,3 +305,10 @@ ununhexium = Element(116, "ununhexium", "Uuh", 292*daltons)
# relational operators will work with any chosen name # relational operators will work with any chosen name
sulphur = sulfur sulphur = sulfur
aluminium = aluminum aluminium = aluminum
if sys.version_info >= (3, 0):
def _iteritems(dict):
return dict.items()
else:
def _iteritems(dict):
return dict.iteritems()
...@@ -28,6 +28,8 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,8 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
from __future__ import print_function
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
__version__ = "1.0" __version__ = "1.0"
...@@ -38,7 +40,7 @@ import math ...@@ -38,7 +40,7 @@ import math
from math import sqrt, cos from math import sqrt, cos
import simtk.openmm as mm import simtk.openmm as mm
import simtk.unit as unit import simtk.unit as unit
import element as elem from . import element as elem
from simtk.openmm.app import Topology from simtk.openmm.app import Topology
def _convertParameterToNumber(param): def _convertParameterToNumber(param):
...@@ -1883,7 +1885,7 @@ def countConstraint(data): ...@@ -1883,7 +1885,7 @@ def countConstraint(data):
if (isConstrained): if (isConstrained):
angleCount += 1 angleCount += 1
print "Constraints bond=%d angle=%d total=%d" % (bondCount, angleCount, (bondCount+angleCount)) print("Constraints bond=%d angle=%d total=%d" % (bondCount, angleCount, (bondCount+angleCount)))
## @private ## @private
class AmoebaBondGenerator: class AmoebaBondGenerator:
......
...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,6 +28,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Lee-Ping Wang" __author__ = "Lee-Ping Wang"
__version__ = "1.0" __version__ = "1.0"
...@@ -36,7 +37,7 @@ import sys ...@@ -36,7 +37,7 @@ import sys
from simtk.openmm import Vec3 from simtk.openmm import Vec3
from re import sub, match from re import sub, match
from simtk.unit import nanometers, angstroms, Quantity from simtk.unit import nanometers, angstroms, Quantity
import element as elem from . import element as elem
try: try:
import numpy import numpy
except: except:
......
...@@ -28,14 +28,15 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -28,14 +28,15 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
__author__ = "Peter Eastman" __author__ = "Peter Eastman"
__version__ = "1.0" __version__ = "1.0"
from simtk.openmm.app import Topology from simtk.openmm.app import Topology
from simtk.openmm.app import PDBFile from simtk.openmm.app import PDBFile
import forcefield as ff from . import forcefield as ff
import element as elem from . import element as elem
import amberprmtopfile as prmtop from . import amberprmtopfile as prmtop
import simtk.unit as unit import simtk.unit as unit
import simtk.openmm as mm import simtk.openmm as mm
import math import math
...@@ -601,7 +602,7 @@ class GromacsTopFile(object): ...@@ -601,7 +602,7 @@ class GromacsTopFile(object):
for key in self._dihedralTypes: for key in self._dihedralTypes:
if key[1] == 'X' or key[2] == 'X': if key[1] == 'X' or key[2] == 'X':
wildcardDihedralTypes.append(key) wildcardDihedralTypes.append(key)
for types in dihedralTypeTable.itervalues(): for types in dihedralTypeTable.values():
types.append(key) types.append(key)
# Loop over molecules and create the specified number of each type. # Loop over molecules and create the specified number of each type.
...@@ -617,7 +618,7 @@ class GromacsTopFile(object): ...@@ -617,7 +618,7 @@ class GromacsTopFile(object):
try: try:
bondedTypes = [self._atomTypes[t][1] for t in atomTypes] bondedTypes = [self._atomTypes[t][1] for t in atomTypes]
except KeyError as e: except KeyError as e:
raise ValueError('Unknown atom type: '+e.message) raise ValueError('Unknown atom type: ' + e.message)
bondedTypes = [b if b is not None else a for a, b in zip(atomTypes, bondedTypes)] bondedTypes = [b if b is not None else a for a, b in zip(atomTypes, bondedTypes)]
# Add atoms. # Add atoms.
......
...@@ -34,6 +34,8 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -34,6 +34,8 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
from __future__ import print_function
#============================================================================================= #=============================================================================================
# GLOBAL IMPORTS # GLOBAL IMPORTS
...@@ -54,7 +56,7 @@ import simtk.openmm ...@@ -54,7 +56,7 @@ import simtk.openmm
from simtk.openmm.app import element as elem from simtk.openmm.app import element as elem
from simtk.openmm.app.internal.unitcell import computePeriodicBoxVectors from simtk.openmm.app.internal.unitcell import computePeriodicBoxVectors
from simtk.openmm.vec3 import Vec3 from simtk.openmm.vec3 import Vec3
import customgbforces as customgb from . import customgbforces as customgb
#============================================================================================= #=============================================================================================
# AMBER parmtop loader (from 'zander', by Randall J. Radmer) # AMBER parmtop loader (from 'zander', by Randall J. Radmer)
...@@ -713,7 +715,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No ...@@ -713,7 +715,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No
raise Exception("Cannot specify both a filename and a loader") raise Exception("Cannot specify both a filename and a loader")
if prmtop_filename is not None: if prmtop_filename is not None:
# Load prmtop file. # Load prmtop file.
if verbose: print "Reading prmtop file '%s'..." % prmtop_filename if verbose: print("Reading prmtop file '%s'..." % prmtop_filename)
prmtop = PrmtopLoader(prmtop_filename) prmtop = PrmtopLoader(prmtop_filename)
else: else:
prmtop = prmtop_loader prmtop = prmtop_loader
...@@ -737,11 +739,11 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No ...@@ -737,11 +739,11 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No
mm = simtk.openmm mm = simtk.openmm
# Create OpenMM System. # Create OpenMM System.
if verbose: print "Creating OpenMM system..." if verbose: print("Creating OpenMM system...")
system = mm.System() system = mm.System()
# Populate system with atomic masses. # Populate system with atomic masses.
if verbose: print "Adding particles..." if verbose: print("Adding particles...")
for mass in prmtop.getMasses(): for mass in prmtop.getMasses():
system.addParticle(mass) system.addParticle(mass)
...@@ -759,7 +761,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No ...@@ -759,7 +761,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No
system.addConstraint(iAtom, jAtom, rMin) system.addConstraint(iAtom, jAtom, rMin)
# Add harmonic bonds. # Add harmonic bonds.
if verbose: print "Adding bonds..." if verbose: print("Adding bonds...")
force = mm.HarmonicBondForce() force = mm.HarmonicBondForce()
if flexibleConstraints or (shake not in ('h-bonds', 'all-bonds', 'h-angles')): if flexibleConstraints or (shake not in ('h-bonds', 'all-bonds', 'h-angles')):
for (iAtom, jAtom, k, rMin) in prmtop.getBondsWithH(): for (iAtom, jAtom, k, rMin) in prmtop.getBondsWithH():
...@@ -771,7 +773,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No ...@@ -771,7 +773,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No
system.addForce(force) system.addForce(force)
# Add harmonic angles. # Add harmonic angles.
if verbose: print "Adding angles..." if verbose: print("Adding angles...")
force = mm.HarmonicAngleForce() force = mm.HarmonicAngleForce()
if shake == 'h-angles': if shake == 'h-angles':
numConstrainedBonds = system.getNumConstraints() numConstrainedBonds = system.getNumConstraints()
...@@ -809,14 +811,14 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No ...@@ -809,14 +811,14 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No
system.addForce(force) system.addForce(force)
# Add torsions. # Add torsions.
if verbose: print "Adding torsions..." if verbose: print("Adding torsions...")
force = mm.PeriodicTorsionForce() force = mm.PeriodicTorsionForce()
for (iAtom, jAtom, kAtom, lAtom, forceConstant, phase, periodicity) in prmtop.getDihedrals(): for (iAtom, jAtom, kAtom, lAtom, forceConstant, phase, periodicity) in prmtop.getDihedrals():
force.addTorsion(iAtom, jAtom, kAtom, lAtom, periodicity, phase, forceConstant) force.addTorsion(iAtom, jAtom, kAtom, lAtom, periodicity, phase, forceConstant)
system.addForce(force) system.addForce(force)
# Add nonbonded interactions. # Add nonbonded interactions.
if verbose: print "Adding nonbonded interactions..." if verbose: print("Adding nonbonded interactions...")
force = mm.NonbondedForce() force = mm.NonbondedForce()
if (prmtop.getIfBox() == 0): if (prmtop.getIfBox() == 0):
# System is non-periodic. # System is non-periodic.
...@@ -1044,7 +1046,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No ...@@ -1044,7 +1046,7 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No
# Convert implicitSolventKappa to nanometers if it is a unit. # Convert implicitSolventKappa to nanometers if it is a unit.
if units.is_quantity(implicitSolventKappa): if units.is_quantity(implicitSolventKappa):
implicitSolventKappa = implicitSolventKappa.value_in_unit((1/units.nanometers).unit) implicitSolventKappa = implicitSolventKappa.value_in_unit((1/units.nanometers).unit)
if verbose: print "Adding GB parameters..." if verbose: print("Adding GB parameters...")
charges = prmtop.getCharges() charges = prmtop.getCharges()
cutoff = None cutoff = None
if nonbondedMethod != 'NoCutoff': if nonbondedMethod != 'NoCutoff':
...@@ -1071,14 +1073,15 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No ...@@ -1071,14 +1073,15 @@ def readAmberSystem(topology, prmtop_filename=None, prmtop_loader=None, shake=No
gb = customgb.GBSAGBn2Force(solventDielectric, soluteDielectric, 'ACE', cutoff, implicitSolventKappa) gb = customgb.GBSAGBn2Force(solventDielectric, soluteDielectric, 'ACE', cutoff, implicitSolventKappa)
else: else:
raise Exception("Illegal value specified for implicit solvent model") raise Exception("Illegal value specified for implicit solvent model")
for iAtom in range(prmtop.getNumAtoms()):
for charge, gb_parm in zip(charges, gb_parms):
if gbmodel == 'OBC2' and implicitSolventKappa == 0: if gbmodel == 'OBC2' and implicitSolventKappa == 0:
gb.addParticle(charges[iAtom], gb_parms[iAtom][0], gb_parms[iAtom][1]) gb.addParticle(charge, gb_parm[0], gb_parm[1])
elif gbmodel == 'GBn2': elif gbmodel == 'GBn2':
gb.addParticle([charges[iAtom], gb_parms[iAtom][0], gb_parms[iAtom][1], gb.addParticle([charge, gb_parm[0], gb_parm[1],
gb_parms[iAtom][2], gb_parms[iAtom][3], gb_parms[iAtom][4]]) gb_parm[2], gb_parm[3], gb_parm[4]])
else: else:
gb.addParticle([charges[iAtom], gb_parms[iAtom][0], gb_parms[iAtom][1]]) gb.addParticle([charge, gb_parm[0], gb_parm[1]])
system.addForce(gb) system.addForce(gb)
if nonbondedMethod == 'NoCutoff': if nonbondedMethod == 'NoCutoff':
gb.setNonbondedMethod(mm.NonbondedForce.NoCutoff) gb.setNonbondedMethod(mm.NonbondedForce.NoCutoff)
......
...@@ -33,7 +33,12 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -33,7 +33,12 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
from simtk.openmm.app.internal.charmm.exceptions import CharmmFileError from simtk.openmm.app.internal.charmm.exceptions import CharmmFileError
import sys
if sys.version_info < (3, 0):
from codecs import open
class CharmmFile(object): class CharmmFile(object):
""" """
...@@ -54,8 +59,8 @@ class CharmmFile(object): ...@@ -54,8 +59,8 @@ class CharmmFile(object):
else: else:
self.status = 'NEW' self.status = 'NEW'
try: try:
self._handle = open(fname, mode) self._handle = open(fname, mode, encoding='utf-8')
except IOError, e: except IOError as e:
raise CharmmFileError(str(e)) raise CharmmFileError(str(e))
self.closed = False self.closed = False
self.line_number = 0 self.line_number = 0
......
...@@ -32,6 +32,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR ...@@ -32,6 +32,7 @@ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
USE OR OTHER DEALINGS IN THE SOFTWARE. USE OR OTHER DEALINGS IN THE SOFTWARE.
""" """
from __future__ import absolute_import
from simtk.openmm.app.internal.charmm.exceptions import ( from simtk.openmm.app.internal.charmm.exceptions import (
SplitResidueWarning, BondError, ResidueError, CmapError, SplitResidueWarning, BondError, ResidueError, CmapError,
MissingParameter) MissingParameter)
......
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