"""Nucleic Acid Structures for PDB2PQR
This module contains the base nucleic acid structures for pdb2pqr.
.. codeauthor:: Todd Dolinsky
.. codeauthor:: Nathan Baker
"""
from . import residue
from . import structures as struct
[docs]class Nucleic(residue.Residue):
"""This class provides standard features of the nucleic acids listed
below.
"""
[docs] def __init__(self, atoms, ref):
sample_atom = atoms[-1]
self.atoms = []
self.name = sample_atom.res_name
self.chain_id = sample_atom.chain_id
self.res_seq = sample_atom.res_seq
self.ins_code = sample_atom.ins_code
self.ffname = self.name
self.map = {}
self.dihedrals = []
self.patches = []
self.is3term = 0
self.is5term = 0
self.is_c_term = 0
self.is_n_term = 0
self.missing = []
self.reference = ref
# Create each atom
for atom in atoms:
if atom.name in ref.altnames: # Rename atoms
atom.name = ref.altnames[atom.name]
if atom.name not in self.map:
atom_ = struct.Atom(atom, "ATOM", self)
self.add_atom(atom_)
[docs] def create_atom(self, atomname, newcoords):
"""Create an atom.
Overrides the generic residue's create_atom().
.. todo:: This code is duplicated in several places.
:param atomname: the name of the atom to add
:type atomname: str
:param newcoords: the coordinates of the atom
:type newcoords: [(float, float, float)]
"""
oldatom = self.atoms[0]
newatom = struct.Atom(oldatom, "ATOM", self)
newatom.x = newcoords[0]
newatom.y = newcoords[1]
newatom.z = newcoords[2]
newatom.name = atomname
newatom.element = atomname[0]
newatom.occupancy = 1.0
newatom.temp_factor = 0.0
newatom.added = 1
self.add_atom(newatom)
[docs] def add_atom(self, atom):
"""Add existing atom to system.
Override the existing add_atom - include the link to the reference
object.
:param atom: atom to add to system.
:type atom: Atom
"""
self.atoms.append(atom)
atomname = atom.name
self.map[atomname] = atom
try:
atom.reference = self.reference.map[atomname]
for bond in atom.reference.bonds:
if self.has_atom(bond):
bondatom = self.map[bond]
if bondatom not in atom.bonds:
atom.bonds.append(bondatom)
if atom not in bondatom.bonds:
bondatom.bonds.append(atom)
except KeyError:
atom.reference = None
[docs] def add_dihedral_angle(self, value):
"""Add the value to the list of chi angles.
:param value: dihedral angle to add to list (in degrees)
:type value: float
"""
self.dihedrals.append(value)
[docs] def set_state(self):
"""Adds the termini for all inherited objects."""
if self.is5term:
self.ffname = self.ffname + "5"
if self.is3term:
self.ffname = self.ffname + "3"
[docs]class ADE(Nucleic):
"""Adenosine class."""
[docs] def __init__(self, atoms, ref):
"""Initialize residue.
:param atoms: add atoms to residue
:type atoms: [Atom]
"""
Nucleic.__init__(self, atoms, ref)
self.reference = ref
[docs] def letter_code(self):
"""Return letter code for nucleic acid.
:return: letter code for nucleic acid
:rtype: str
"""
return "A"
[docs] def set_state(self):
"""Set ribo- vs. deoxyribo- state of this residue."""
self.ffname = "RA" if self.has_atom("O2'") else "DA"
Nucleic.set_state(self)
DA = ADE
RA = ADE
A = ADE
[docs]class CYT(Nucleic):
"""Cytidine class"""
[docs] def __init__(self, atoms, ref):
"""Initialize residue.
:param atoms: add atoms to residue
:type atoms: [Atom]
"""
Nucleic.__init__(self, atoms, ref)
self.reference = ref
[docs] def letter_code(self):
"""Return letter code for nucleic acid.
:return: letter code for nucleic acid
:rtype: str
"""
return "C"
[docs] def set_state(self):
"""Set ribo- vs. deoxyribo- state of this residue."""
self.ffname = "RC" if self.has_atom("O2'") else "DC"
Nucleic.set_state(self)
DC = CYT
RC = CYT
C = CYT
[docs]class GUA(Nucleic):
"""Guanosine class"""
[docs] def __init__(self, atoms, ref):
"""Initialize residue.
:param atoms: add atoms to residue
:type atoms: [Atom]
"""
Nucleic.__init__(self, atoms, ref)
self.reference = ref
[docs] def letter_code(self):
"""Return letter code for nucleic acid.
:return: letter code for nucleic acid
:rtype: str
"""
return "G"
[docs] def set_state(self):
"""Set ribo- vs. deoxyribo- state of this residue."""
self.ffname = "RG" if self.has_atom("O2'") else "DG"
Nucleic.set_state(self)
DG = GUA
RG = GUA
G = GUA
[docs]class THY(Nucleic):
"""Thymine class"""
[docs] def __init__(self, atoms, ref):
"""Initialize residue.
:param atoms: add atoms to residue
:type atoms: [Atom]
"""
Nucleic.__init__(self, atoms, ref)
self.reference = ref
[docs] def letter_code(self):
"""Return letter code for nucleic acid.
:return: letter code for nucleic acid
:rtype: str
"""
return "T"
[docs] def set_state(self):
"""Set ribo- vs. deoxyribo- state of this residue."""
self.ffname = "DT"
Nucleic.set_state(self)
DT = THY
[docs]class URA(Nucleic):
"""Uridine class"""
[docs] def __init__(self, atoms, ref):
"""Initialize residue.
:param atoms: add atoms to residue
:type atoms: [Atom]
"""
Nucleic.__init__(self, atoms, ref)
self.reference = ref
[docs] def letter_code(self):
"""Return letter code for nucleic acid.
:return: letter code for nucleic acid
:rtype: str
"""
return "U"
[docs] def set_state(self):
"""Set ribo- vs. deoxyribo- state of this residue."""
self.ffname = "RU"
Nucleic.set_state(self)
RU = URA
U = URA