# @file monomer3D.py
# Defines monomer3D class and contains useful manipulation/retrieval routines.
#
# Written by HJK Group
#
# Dpt of Chemical Engineering, MIT
[docs]class monomer3D:
"""Holds information about a monomer, used to do manipulations.
Reads information from structure file (pdb) or is directly built from molsimplify.
"""
def __init__(self, three_lc='GLY', chain='undef', id=-1, occup=1.00, loc=''):
# List of atom3D objects
self.atoms = []
# Number of atoms
self.natoms = 0
# 3-letter code of amino acid (in all caps); alternatively, 1-letter code of nucleotide
self.three_lc = three_lc # if no name is specified, defaults to glycine
# Mass of molecule
self.mass = 0
# Size of molecule
self.size = 0
# Chain of monomer
self.chain = chain
# ID of monomer (position in chain)
self.id = id
# Occupancy of monomer in chain
self.occup = occup
# Peptide bond atoms
self.c = []
self.n = []
# Bonds
self.bonds = {}
# Next monomer in the chain
self.next = None
# Previous monomer in the chain
self.prev = None
# Location (if more than one conformation)
self.loc = loc
# Temporary list for storing conformations
self.temp_list = []
def __repr__(self):
return f"monomer3D({self.three_lc}, id={self.id})"
[docs] def identify(self):
""" States whether the amino acid is (positively/negatively) charged, polar, or hydrophobic.
Returns
-------
aa_type : string
Positively charged, Negatively charged, Polar, Hydrophobic
"""
if self.three_lc == "ARG" or self.three_lc == "LYS":
return "Positively charged"
elif self.three_lc == "ASP" or self.three_lc == "GLU":
return "Negatively charged"
elif self.three_lc in {"GLN", "ASN", "HIS", "SER", "THR", "TYR", "CYS"}:
return "Polar"
else:
return "Hydrophobic"
[docs] def getGreek(self, greek):
""" Finds the Greek lettered carbon(s) or other atom(s) of the user's choice.
Parameters
----------
greek : string
The Greek lettered atom (e.g. alpha carbon) we want. Inputs should be form 'CA' or similar.
Returns
-------
greek_atoms : list of atom3Ds
A list of atom3D class objects that contains the Greek lettered atom(s) we want.
"""
greek_atoms = []
for (ii, a) in self.atoms:
if greek in a.greek:
greek_atoms.append(a)
return greek_atoms
[docs] def coords(self):
"""Method to obtain string of coordinates in monomer.
Returns
-------
coord_string : string
String of molecular coordinates with atom identities in XYZ format.
"""
coord_string = '' # initialize returning string
coord_string += "%d \n\n" % self.natoms
for (ii, atom) in self.atoms:
xyz = atom.coords()
coord_string += "%s \t%f\t%f\t%f\n" % (atom.sym, xyz[0], xyz[1], xyz[2])
return coord_string
[docs] def centermass(self):
"""Computes coordinates of center of mass of monomer.
Returns
-------
center_of_mass : list
Coordinates of center of mass. List of length 3: (X, Y, Z).
"""
center_of_mass = [0, 0, 0]
mmass = 0
# loop over atoms in molecule
if self.natoms > 0:
for (ii, atom) in self.atoms:
# calculate center of mass (relative weight according to atomic mass)
xyz = atom.coords()
center_of_mass[0] += xyz[0] * atom.mass
center_of_mass[1] += xyz[1] * atom.mass
center_of_mass[2] += xyz[2] * atom.mass
mmass += atom.mass
# normalize
center_of_mass[0] /= mmass
center_of_mass[1] /= mmass
center_of_mass[2] /= mmass
else:
center_of_mass = False
print(
'ERROR: Center of mass calculation failed. Structure will be inaccurate.\n')
return center_of_mass
[docs] def centroid(self):
"""Computes coordinates of centroid of monomer.
Returns
-------
centroid : list
Coordinates of centroid. List of length 3: (X, Y, Z).
"""
centroid = [0, 0, 0]
# loop over atoms in molecule
if self.natoms > 0:
for (ii, atom) in self.atoms:
# calculate center of mass (relative weight according to atomic mass)
xyz = atom.coords()
centroid[0] += xyz[0]
centroid[1] += xyz[1]
centroid[2] += xyz[2]
else:
centroid = False
print(
'ERROR: Centroid calculation failed. Structure will be inaccurate.\n')
return centroid
[docs] def setBonds(self):
""" Sets the bonds between atoms within the monomer.
"""
# bonds : dictionary (represents an undirected graph)
# Keyed by atom3D atoms in the monomer
# Valued by a set consisting of bonded atoms
for (ii, key) in self.atoms:
if key not in self.bonds.keys():
self.bonds[key] = set()
if key.greek == 'C':
for (a_id, a) in self.atoms:
if a.greek == 'O' or a.greek == "CA":
self.bonds[key].add(a)
if a not in self.bonds.keys():
self.bonds[a] = set()
self.bonds[a].add(key)
if key.greek == 'CA':
for (a_id, a) in self.atoms:
if a.greek == 'CB' or a.greek == "N":
self.bonds[key].add(a)
if a not in self.bonds.keys():
self.bonds[a] = set()
self.bonds[a].add(key)
if "G" in key.greek:
for (a_id, a) in self.atoms:
if 'B' in a.greek or "D" in a.greek:
self.bonds[key].add(a)
if a not in self.bonds.keys():
self.bonds[a] = set()
self.bonds[a].add(key)
if "E" in key.greek:
for (a_id, a) in self.atoms:
if 'Z' in a.greek or "D" in a.greek:
self.bonds[key].add(a)
if a not in self.bonds.keys():
self.bonds[a] = set()
self.bonds[a].add(key)
[docs] def getPeptideAtoms(self):
""" Makes the atoms involved in peptide bonding attributes.
"""
for (ii, a) in self.atoms:
if a.greek == "C":
self.c = a
elif a.greek == "N":
self.n = a
[docs] def setNext(self, next_aa):
""" Sets the next monomer in the chain of a protein (if applicable).
Parameters
----------
next_aa : monomer3D
the monomer that is next in the protein chain
"""
self.next = next_aa
[docs] def setPrev(self, prev_aa):
""" Sets the previous monomer in the chain of a protein (if applicable).
Parameters
----------
prev_aa : monomer3D
the monomer that comes before self in the protein chain
"""
self.prev = prev_aa
[docs] def addAtom(self, atom, index=None):
"""Adds an atom to the atoms attribute, which contains a list of
atom3D class instances.
Parameters
----------
atom : atom3D
atom3D class instance of added atom.
index : int, optional
Index of added atom. Default is None.
auto_populate_BO_dict : bool, optional
Populate bond order dictionary with newly added atom. Default is True.
"""
if index is None:
index = len(self.atoms)
# self.atoms.append(atom)
self.atoms.append((index, atom))
self.natoms += 1
self.mass += atom.mass
self.metal = False
[docs] def setLoc(self, loc):
""" Sets the conformation of a monomer in the chain of a protein.
Parameters
----------
loc : str
a one-character string representing the conformation
"""
self.loc = loc