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

Reporters check for NaNs or infinities in output

parent 4e480ff6
...@@ -35,8 +35,9 @@ import array ...@@ -35,8 +35,9 @@ import array
import os import os
import time import time
import struct import struct
from simtk.unit import picoseconds, nanometers, angstroms, is_quantity import math
from simtk.unit import picoseconds, nanometers, angstroms, is_quantity, norm
class DCDFile(object): class DCDFile(object):
"""DCDFile provides methods for creating DCD files. """DCDFile provides methods for creating DCD files.
...@@ -89,6 +90,10 @@ class DCDFile(object): ...@@ -89,6 +90,10 @@ class DCDFile(object):
raise ValueError('The number of positions must match the number of atoms') raise ValueError('The number of positions must match the number of atoms')
if is_quantity(positions): if is_quantity(positions):
positions = positions.value_in_unit(nanometers) positions = positions.value_in_unit(nanometers)
if any(math.isnan(norm(pos)) for pos in positions):
raise ValueError('Particle position is NaN')
if any(math.isinf(norm(pos)) for pos in positions):
raise ValueError('Particle position is infinite')
file = self._file file = self._file
# Update the header. # Update the header.
......
...@@ -33,12 +33,13 @@ __version__ = "1.0" ...@@ -33,12 +33,13 @@ __version__ = "1.0"
import os import os
import sys import sys
import math
import xml.etree.ElementTree as etree import xml.etree.ElementTree as etree
from copy import copy from copy import copy
from simtk.openmm import Vec3 from simtk.openmm import Vec3
from simtk.openmm.app.internal.pdbstructure import PdbStructure from simtk.openmm.app.internal.pdbstructure import PdbStructure
from simtk.openmm.app import Topology from simtk.openmm.app import Topology
from simtk.unit import nanometers, angstroms, is_quantity from simtk.unit import nanometers, angstroms, is_quantity, norm
import element as elem import element as elem
try: try:
import numpy import numpy
...@@ -240,6 +241,10 @@ class PDBFile(object): ...@@ -240,6 +241,10 @@ class PDBFile(object):
raise ValueError('The number of positions must match the number of atoms') raise ValueError('The number of positions must match the number of atoms')
if is_quantity(positions): if is_quantity(positions):
positions = positions.value_in_unit(angstroms) positions = positions.value_in_unit(angstroms)
if any(math.isnan(norm(pos)) for pos in positions):
raise ValueError('Particle position is NaN')
if any(math.isinf(norm(pos)) for pos in positions):
raise ValueError('Particle position is infinite')
atomIndex = 1 atomIndex = 1
posIndex = 0 posIndex = 0
if modelIndex is not None: if modelIndex is not None:
......
...@@ -34,6 +34,7 @@ __version__ = "1.0" ...@@ -34,6 +34,7 @@ __version__ = "1.0"
import simtk.openmm as mm import simtk.openmm as mm
import simtk.unit as unit import simtk.unit as unit
from simtk.openmm.app import PDBFile from simtk.openmm.app import PDBFile
import math
class StateDataReporter(object): class StateDataReporter(object):
"""StateDataReporter outputs information about a simulation, such as energy and temperature, to a file. """StateDataReporter outputs information about a simulation, such as energy and temperature, to a file.
...@@ -136,6 +137,15 @@ class StateDataReporter(object): ...@@ -136,6 +137,15 @@ class StateDataReporter(object):
print >>self._out, '#"%s"' % ('"'+self._separator+'"').join(headers) print >>self._out, '#"%s"' % ('"'+self._separator+'"').join(headers)
self._hasInitialized = True self._hasInitialized = True
# Check for errors.
if self._needEnergy:
energy = (state.getKineticEnergy()+state.getPotentialEnergy()).value_in_unit(unit.kilojoules_per_mole)
if math.isnan(energy):
raise ValueError('Energy is NaN')
if math.isinf(energy):
raise ValueError('Energy is infinite')
# Write the values. # Write the values.
values = [] values = []
......
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