Commit c29c1d57 authored by peastman's avatar peastman
Browse files

Merge pull request #92 from peastman/master

Speed optimization to GromacsTopFile
parents ea65f7c2 8060c45f
...@@ -463,6 +463,24 @@ class GromacsTopFile(object): ...@@ -463,6 +463,24 @@ class GromacsTopFile(object):
exceptions = [] exceptions = []
fudgeQQ = float(self._defaults[4]) fudgeQQ = float(self._defaults[4])
# Build a lookup table to let us process dihedrals more quickly.
dihedralTypeTable = {}
for key in self._dihedralTypes:
if key[1] != 'X' and key[2] != 'X':
if (key[1], key[2]) not in dihedralTypeTable:
dihedralTypeTable[(key[1], key[2])] = []
dihedralTypeTable[(key[1], key[2])].append(key)
if (key[2], key[1]) not in dihedralTypeTable:
dihedralTypeTable[(key[2], key[1])] = []
dihedralTypeTable[(key[2], key[1])].append(key)
wildcardDihedralTypes = []
for key in self._dihedralTypes:
if key[1] == 'X' or key[2] == 'X':
wildcardDihedralTypes.append(key)
for types in dihedralTypeTable.itervalues():
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.
for moleculeName, moleculeCount in self._molecules: for moleculeName, moleculeCount in self._molecules:
...@@ -584,7 +602,11 @@ class GromacsTopFile(object): ...@@ -584,7 +602,11 @@ class GromacsTopFile(object):
else: else:
# Look for a matching dihedral type. # Look for a matching dihedral type.
paramsList = None paramsList = None
for key in self._dihedralTypes: if (types[1], types[2]) in dihedralTypeTable:
dihedralTypes = dihedralTypeTable[(types[1], types[2])]
else:
dihedralTypes = wildcardDihedralTypes
for key in dihedralTypes:
if all(a == b or a == 'X' for a, b in zip(key, types)) or all(a == b or a == 'X' for a, b in zip(key, reversedTypes)): if all(a == b or a == 'X' for a, b in zip(key, types)) or all(a == b or a == 'X' for a, b in zip(key, reversedTypes)):
paramsList = self._dihedralTypes[key] paramsList = self._dihedralTypes[key]
if 'X' not in key: if 'X' not in key:
......
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