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