Commit 032c0498 authored by tic20's avatar tic20
Browse files

simple optimization to ForceField class

parent bd788d90
...@@ -263,17 +263,17 @@ class ForceField(object): ...@@ -263,17 +263,17 @@ class ForceField(object):
template = ForceField._TemplateData(resName) template = ForceField._TemplateData(resName)
if 'override' in residue.attrib: if 'override' in residue.attrib:
template.overrideLevel = int(residue.attrib['override']) template.overrideLevel = int(residue.attrib['override'])
atomIndices = {} atomIndices = template.atomIndices
for atom in residue.findall('Atom'): for ia, atom in enumerate(residue.findall('Atom')):
params = {} params = {}
for key in atom.attrib: a_attrib = atom.attrib
if key not in ('name', 'type'): atomName = a_attrib.pop('name')
params[key] = _convertParameterToNumber(atom.attrib[key])
atomName = atom.attrib['name']
if atomName in atomIndices: if atomName in atomIndices:
raise ValueError('Residue '+resName+' contains multiple atoms named '+atomName) raise ValueError('Residue '+resName+' contains multiple atoms named '+atomName)
atomIndices[atomName] = len(template.atoms) typeName = a_attrib.pop('type')
typeName = atom.attrib['type'] for key in atom.attrib:
params[key] = _convertParameterToNumber(atom.attrib[key])
atomIndices[atomName] = ia
template.atoms.append(ForceField._TemplateAtomData(atomName, typeName, self._atomTypes[typeName].element, params)) template.atoms.append(ForceField._TemplateAtomData(atomName, typeName, self._atomTypes[typeName].element, params))
for site in residue.findall('VirtualSite'): for site in residue.findall('VirtualSite'):
template.virtualSites.append(ForceField._VirtualSiteData(site, atomIndices)) template.virtualSites.append(ForceField._VirtualSiteData(site, atomIndices))
...@@ -588,6 +588,7 @@ class ForceField(object): ...@@ -588,6 +588,7 @@ class ForceField(object):
def __init__(self, name): def __init__(self, name):
self.name = name self.name = name
self.atoms = [] self.atoms = []
self.atomIndices = {}
self.virtualSites = [] self.virtualSites = []
self.bonds = [] self.bonds = []
self.externalBonds = [] self.externalBonds = []
...@@ -595,8 +596,8 @@ class ForceField(object): ...@@ -595,8 +596,8 @@ class ForceField(object):
def getAtomIndexByName(self, atom_name): def getAtomIndexByName(self, atom_name):
"""Look up an atom index by atom name, providing a helpful error message if not found.""" """Look up an atom index by atom name, providing a helpful error message if not found."""
for (index, atom) in enumerate(self.atoms): index = self.atomIndices.get(atom_name, None)
if atom.name == atom_name: if index is not None:
return index return index
# Provide a helpful error message if atom name not found. # Provide a helpful error message if atom name not found.
...@@ -604,6 +605,10 @@ class ForceField(object): ...@@ -604,6 +605,10 @@ class ForceField(object):
msg += "Possible atom names are: %s" % str(list(map(lambda x: x.name, self.atoms))) msg += "Possible atom names are: %s" % str(list(map(lambda x: x.name, self.atoms)))
raise ValueError(msg) raise ValueError(msg)
def addAtom(self, atom):
self.atoms.append(atom)
self.atomIndices[atom.name] = len(self.atoms)
def addBond(self, atom1, atom2): def addBond(self, atom1, atom2):
"""Add a bond between two atoms in a template given their indices in the template.""" """Add a bond between two atoms in a template given their indices in the template."""
self.bonds.append((atom1, atom2)) self.bonds.append((atom1, atom2))
...@@ -712,11 +717,11 @@ class ForceField(object): ...@@ -712,11 +717,11 @@ class ForceField(object):
for atom in template.atoms: for atom in template.atoms:
if not any(deleted.name == atom.name and deleted.residue == index for deleted in self.deletedAtoms): if not any(deleted.name == atom.name and deleted.residue == index for deleted in self.deletedAtoms):
newTemplate.atoms.append(ForceField._TemplateAtomData(atom.name, atom.type, atom.element, atom.parameters)) newTemplate.addAtom(ForceField._TemplateAtomData(atom.name, atom.type, atom.element, atom.parameters))
for atom in self.addedAtoms[index]: for atom in self.addedAtoms[index]:
if any(a.name == atom.name for a in newTemplate.atoms): if any(a.name == atom.name for a in newTemplate.atoms):
raise ValueError("Patch '%s' adds an atom with the same name as an existing atom: %s" % (self.name, atom.name)) raise ValueError("Patch '%s' adds an atom with the same name as an existing atom: %s" % (self.name, atom.name))
newTemplate.atoms.append(ForceField._TemplateAtomData(atom.name, atom.type, atom.element, atom.parameters)) newTemplate.addAtom(ForceField._TemplateAtomData(atom.name, atom.type, atom.element, atom.parameters))
oldAtomIndex = dict([(atom.name, i) for i, atom in enumerate(template.atoms)]) oldAtomIndex = dict([(atom.name, i) for i, atom in enumerate(template.atoms)])
newAtomIndex = dict([(atom.name, i) for i, atom in enumerate(newTemplate.atoms)]) newAtomIndex = dict([(atom.name, i) for i, atom in enumerate(newTemplate.atoms)])
for atom in self.changedAtoms[index]: for atom in self.changedAtoms[index]:
...@@ -1631,7 +1636,7 @@ def _createResidueTemplate(residue): ...@@ -1631,7 +1636,7 @@ def _createResidueTemplate(residue):
""" """
template = ForceField._TemplateData(residue.name) template = ForceField._TemplateData(residue.name)
for atom in residue.atoms(): for atom in residue.atoms():
template.atoms.append(ForceField._TemplateAtomData(atom.name, None, atom.element)) template.addAtom(ForceField._TemplateAtomData(atom.name, None, atom.element))
for (atom1,atom2) in residue.internal_bonds(): for (atom1,atom2) in residue.internal_bonds():
template.addBondByName(atom1.name, atom2.name) template.addBondByName(atom1.name, atom2.name)
residue_atoms = [ atom for atom in residue.atoms() ] residue_atoms = [ atom for atom in residue.atoms() ]
......
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