Skip to content
Snippets Groups Projects
Commit 0797fe29 authored by Gerardo Tauriello's avatar Gerardo Tauriello
Browse files

SCHWED-877: add special treatment for peptide ligands

parent 2451a216
No related branches found
No related tags found
No related merge requests found
...@@ -15,6 +15,46 @@ def _GetRotamerIDs(res_list): ...@@ -15,6 +15,46 @@ def _GetRotamerIDs(res_list):
rotamer_ids[i] = rot_id rotamer_ids[i] = rot_id
return rotamer_ids return rotamer_ids
def _GetPhiAngle(r):
'''Extract phi angle for residue r.'''
# def. fallback = helix
phi = -1.0472
# try to get phi from torsion angles
tor = r.GetPhiTorsion()
if tor.IsValid():
phi = tor.GetAngle()
else:
r_prev = r.handle.prev
if r_prev.IsValid() and mol.InSequence(r_prev, r.handle):
c_prev = r_prev.FindAtom("C")
n = r.FindAtom("N")
ca = r.FindAtom("CA")
c = r.FindAtom("C")
if c_prev.IsValid() and n.IsValid() and ca.IsValid() and c.IsValid():
phi = geom.DihedralAngle(c_prev.GetPos(),n.GetPos(),
ca.GetPos(),c.GetPos())
return phi
def _GetPsiAngle(r):
'''Extract psi angle for residue r.'''
# def. fallback = helix
psi = -0.7854
# try to get psi from torsion angles
tor = r.GetPsiTorsion()
if tor.IsValid():
psi = tor.GetAngle()
else:
r_next = r.handle.next
if r_next.IsValid() and mol.InSequence(r.handle, r_next):
n = r.FindAtom("N")
ca = r.FindAtom("CA")
c = r.FindAtom("C")
n_next = r_next.FindAtom("N")
if n.IsValid() and ca.IsValid() and c.IsValid() and n_next.IsValid():
psi = geom.DihedralAngle(n.GetPos(), ca.GetPos(),
c.GetPos(), n_next.GetPos())
return psi
def _GetDihedrals(res_list): def _GetDihedrals(res_list):
'''Extract dihedral angles for all residues. '''Extract dihedral angles for all residues.
Returns phi and psi angles as 2 lists with length = len(res_list). Returns phi and psi angles as 2 lists with length = len(res_list).
...@@ -22,42 +62,8 @@ def _GetDihedrals(res_list): ...@@ -22,42 +62,8 @@ def _GetDihedrals(res_list):
phi_angles = [0.0] * len(res_list) phi_angles = [0.0] * len(res_list)
psi_angles = [0.0] * len(res_list) psi_angles = [0.0] * len(res_list)
for i,r in enumerate(res_list): for i,r in enumerate(res_list):
# def. fallback = helix phi_angles[i] = _GetPhiAngle(r)
phi = -1.0472 psi_angles[i] = _GetPsiAngle(r)
psi = -0.7854
# try to get phi from torsion angles
tor = r.GetPhiTorsion()
if tor.IsValid():
phi = tor.GetAngle()
elif i > 0:
r_prev = res_list[i-1]
if mol.InSequence(r_prev.handle,r.handle):
c_prev = r_prev.FindAtom("C")
n = r.FindAtom("N")
ca = r.FindAtom("CA")
c = r.FindAtom("C")
if c_prev.IsValid() and n.IsValid() and ca.IsValid() and c.IsValid():
phi = geom.DihedralAngle(c_prev.GetPos(),n.GetPos(),
ca.GetPos(),c.GetPos())
# try to get psi from torsion angles
tor = r.GetPsiTorsion()
if tor.IsValid():
psi = tor.GetAngle()
elif i < (len(res_list) - 1):
r_next = res_list[i+1]
if mol.InSequence(r.handle,r_next.handle):
n = r.FindAtom("N")
ca = r.FindAtom("CA")
c = r.FindAtom("C")
n_next = r_next.FindAtom("N")
if n.IsValid() and ca.IsValid() and c.IsValid() and n_next.IsValid():
psi = geom.DihedralAngle(n.GetPos(), ca.GetPos(),
c.GetPos(), n_next.GetPos())
# store
phi_angles[i] = phi
psi_angles[i] = psi
return phi_angles, psi_angles return phi_angles, psi_angles
def _AddBackboneFrameResidues(frame_residues, res_list, rotamer_ids, def _AddBackboneFrameResidues(frame_residues, res_list, rotamer_ids,
...@@ -76,14 +82,46 @@ def _AddLigandFrameResidues(frame_residues, ent_lig, rotamer_settings, offset): ...@@ -76,14 +82,46 @@ def _AddLigandFrameResidues(frame_residues, ent_lig, rotamer_settings, offset):
'''Update frame_residues (list) with FrameResidues for res. in ent_lig. '''Update frame_residues (list) with FrameResidues for res. in ent_lig.
Set offset >= number of non-ligand residues (used for residue_index). Set offset >= number of non-ligand residues (used for residue_index).
''' '''
# TODO? Split peptides and non-peptides? # parse ligand residues
# for now: add as static carbons for i, res in enumerate(ent_lig.residues):
for i,r in enumerate(ent_lig.residues): res_idx = offset + i
try: is_done = False
frame_residue = sidechain.ConstructFrameResidue(r.handle, offset+i) # special treatment for peptides
frame_residues.append(frame_residue) if res.IsPeptideLinking():
except: rot_id = sidechain.TLCToRotID(res.GetName())
continue if rot_id != sidechain.XXX:
# get more info
phi = _GetPhiAngle(res)
r_prev = res.handle.prev
n_ter = not r_prev.IsValid() \
or not mol.InSequence(r_prev, res.handle)
r_next = res.handle.next
c_ter = not r_next.IsValid() \
or not mol.InSequence(res.handle, r_next)
# try to add frame residues (ignore exceptions)
try:
fr1 = sidechain.ConstructBackboneFrameResidue(\
res.handle, rot_id, res_idx, rotamer_settings,
phi, n_ter, c_ter)
if rot_id != sidechain.ALA and rot_id != sidechain.GLY:
fr2 = sidechain.ConstructSidechainFrameResidue(\
res.handle, rot_id, res_idx, rotamer_settings)
frame_residues.extend([fr1,fr2])
else:
frame_residues.append(fr1)
except:
pass # ignore peptide treatment and treat below
else:
is_done = True
# if it failed, treat it as an unknown entity
if not is_done:
# try to add frame residues (skip exceptions)
try:
# TODO: allow non-carbon treatment
fr = sidechain.ConstructFrameResidue(res.handle, res_idx)
frame_residues.append(fr)
except:
continue
def _AddSidechainFrameResidues(frame_residues, incomplete_sidechains, def _AddSidechainFrameResidues(frame_residues, incomplete_sidechains,
keep_sidechains, res_list, rotamer_ids, keep_sidechains, res_list, rotamer_ids,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment