BbPlane: Difference between revisions
Jump to navigation
Jump to search
(fix H selection) |
|||
Line 19: | Line 19: | ||
<source lang="python"> | <source lang="python"> | ||
# | # | ||
# -- | # -- bbPlane.py - draws a CGO plane across the backbone atoms of | ||
# neighboring amino acids | # neighboring amino acids | ||
# | # | ||
# Author: Jason Vertrees, 06/2010 | # Author: Jason Vertrees, 06/2010 | ||
# Modified by Thomas Holder, 06/2010 | # Modified by Thomas Holder, 06/2010 | ||
# Modified by Blaine Bell, 08/2011 | |||
# Copyright (C) Schrodinger | # Copyright (C) Schrodinger | ||
# Open Source License: MIT | # Open Source License: MIT | ||
Line 34: | Line 35: | ||
""" | """ | ||
DESCRIPTION | DESCRIPTION | ||
Draws a plane across the backbone for a selection | Draws a plane across the backbone for a selection | ||
ARGUMENTS | ARGUMENTS | ||
objSel = string: protein object or selection {default: (all)} | objSel = string: protein object or selection {default: (all)} | ||
color = string: color name or number {default: white} | color = string: color name or number {default: white} | ||
transp = float: transparency component (0.0--1.0) {default: 0.0} | transp = float: transparency component (0.0--1.0) {default: 0.0} | ||
NOTES | NOTES | ||
You need to pass in an object or selection with at least two | You need to pass in an object or selection with at least two | ||
amino acids. The plane spans CA_i, O_i, N-H_(i+1), and CA_(i+1) | amino acids. The plane spans CA_i, O_i, N-H_(i+1), and CA_(i+1) | ||
Line 54: | Line 55: | ||
stored.AAs = [] | stored.AAs = [] | ||
coords = dict() | coords = dict() | ||
# need hydrogens on peptide nitrogen | # need hydrogens on peptide nitrogen | ||
cmd.h_add('(%s) and n. N' % objSel) | cmd.h_add('(%s) and n. N' % objSel) | ||
# get the list of residue ids | # get the list of residue ids | ||
for obj in cmd.get_object_list(objSel): | for obj in cmd.get_object_list(objSel): | ||
Line 73: | Line 74: | ||
if key in coords: | if key in coords: | ||
coords[key][2] = a.coord | coords[key][2] = a.coord | ||
# need at least two amino acids | # need at least two amino acids | ||
if len(stored.AAs) <= 1: | if len(stored.AAs) <= 1: | ||
print "ERROR: Please provide at least two amino acids, the alpha-carbon on the 2nd is needed." | print "ERROR: Please provide at least two amino acids, the alpha-carbon on the 2nd is needed." | ||
return | return | ||
# prepare the cgo | # prepare the cgo | ||
obj = [ | obj = [ | ||
Line 85: | Line 86: | ||
] | ] | ||
obj.extend(cmd.get_color_tuple(color)) | obj.extend(cmd.get_color_tuple(color)) | ||
for res in range(0, len(stored.AAs)-1): | for res in range(0, len(stored.AAs)-1): | ||
curIdx, nextIdx = str(stored.AAs[res]), str(stored.AAs[res+1]) | curIdx, nextIdx = str(stored.AAs[res]), str(stored.AAs[res+1]) | ||
# populate the position array | # populate the position array | ||
pos = [coords[curIdx][0], coords[curIdx][1], coords[nextIdx][2], coords[nextIdx][0]] | pos = [coords[curIdx][0], coords[curIdx][1], coords[nextIdx][2], coords[nextIdx][0]] | ||
# if the data are incomplete for any residues, ignore | # if the data are incomplete for any residues, ignore | ||
if None in pos: | if None in pos: | ||
Line 101: | Line 102: | ||
continue | continue | ||
# need to order vertices to generate correct triangles for plane | |||
# modified/added by B.Bell 8/18/2011 | |||
sumpos = cpv.add(pos[0], cpv.add(pos[1], cpv.add(pos[2], pos[3]))) | |||
centerpos = [ sumpos[0]/4., sumpos[1]/4., sumpos[2]/4. ] | |||
angles = [ [ 0., 0 ] ] | |||
s00 = cpv.sub(pos[0], centerpos) | |||
for i in range(1,4): | |||
s = cpv.sub(pos[i], centerpos) | |||
ang = cpv.get_angle(s00, s) | |||
angles.append( [ ang, i] ) | |||
def sortfirst(a, b): | |||
return cmp(a[0], b[0]) | |||
angles.sort(sortfirst) | |||
verts = map(lambda x: x[1], angles) | |||
vorder = [ verts[0], verts[1], verts[2], | |||
verts[2], verts[3], verts[1] ] | |||
# fill in the vertex data for the triangles; | # fill in the vertex data for the triangles; | ||
for i in | for i in vorder: | ||
obj.append(VERTEX) | obj.append(VERTEX) | ||
obj.extend(pos[i]) | obj.extend(pos[i]) | ||
# finish the CGO | # finish the CGO | ||
obj.append(END) | obj.append(END) | ||
# update the UI | # update the UI | ||
newName = cmd.get_unused_name("backbonePlane") | newName = cmd.get_unused_name("backbonePlane") | ||
cmd.load_cgo(obj, newName) | cmd.load_cgo(obj, newName) | ||
cmd.set("cgo_transparency", transp, newName) | cmd.set("cgo_transparency", transp, newName) | ||
cmd.extend("bbPlane", bbPlane) | cmd.extend("bbPlane", bbPlane) | ||
</source> | </source> |
Revision as of 14:34, 18 August 2011
This script will draw a CGO plane between the backbone atoms of two neighboring residues. This is to show the planarity of the atoms. The image style this is meant to represent can be found many places, like "Introduction to Protein Structure" by Branden and Tooze (2nd ed. pp. 8).
Examples
# download the source and save as bbPlane.py
run bbPlane.py
fetch 1cll
# make planes for residues 4-9
bbPlane i. 4-10
The Source
#
# -- bbPlane.py - draws a CGO plane across the backbone atoms of
# neighboring amino acids
#
# Author: Jason Vertrees, 06/2010
# Modified by Thomas Holder, 06/2010
# Modified by Blaine Bell, 08/2011
# Copyright (C) Schrodinger
# Open Source License: MIT
#
from pymol.cgo import * # get constants
from pymol import cmd, stored
from chempy import cpv
def bbPlane(objSel='(all)', color='white', transp=0.0):
"""
DESCRIPTION
Draws a plane across the backbone for a selection
ARGUMENTS
objSel = string: protein object or selection {default: (all)}
color = string: color name or number {default: white}
transp = float: transparency component (0.0--1.0) {default: 0.0}
NOTES
You need to pass in an object or selection with at least two
amino acids. The plane spans CA_i, O_i, N-H_(i+1), and CA_(i+1)
"""
# format input
transp = float(transp)
stored.AAs = []
coords = dict()
# need hydrogens on peptide nitrogen
cmd.h_add('(%s) and n. N' % objSel)
# get the list of residue ids
for obj in cmd.get_object_list(objSel):
sel = obj + " and (" + objSel + ")"
for a in cmd.get_model(sel + " and n. CA").atom:
key = '/%s/%s/%s/%s' % (obj,a.segi,a.chain,a.resi)
stored.AAs.append(key)
coords[key] = [a.coord,None,None]
for a in cmd.get_model(sel + " and n. O").atom:
key = '/%s/%s/%s/%s' % (obj,a.segi,a.chain,a.resi)
if key in coords:
coords[key][1] = a.coord
for a in cmd.get_model("(hydro or n. CD) and nbr. (" + sel + " and n. N)").atom:
key = '/%s/%s/%s/%s' % (obj,a.segi,a.chain,a.resi)
if key in coords:
coords[key][2] = a.coord
# need at least two amino acids
if len(stored.AAs) <= 1:
print "ERROR: Please provide at least two amino acids, the alpha-carbon on the 2nd is needed."
return
# prepare the cgo
obj = [
BEGIN, TRIANGLES,
COLOR,
]
obj.extend(cmd.get_color_tuple(color))
for res in range(0, len(stored.AAs)-1):
curIdx, nextIdx = str(stored.AAs[res]), str(stored.AAs[res+1])
# populate the position array
pos = [coords[curIdx][0], coords[curIdx][1], coords[nextIdx][2], coords[nextIdx][0]]
# if the data are incomplete for any residues, ignore
if None in pos:
print 'peptide bond %s -> %s incomplete' % (curIdx, nextIdx)
continue
if cpv.distance(pos[0], pos[3]) > 4.0:
print '%s and %s not adjacent' % (curIdx, nextIdx)
continue
# need to order vertices to generate correct triangles for plane
# modified/added by B.Bell 8/18/2011
sumpos = cpv.add(pos[0], cpv.add(pos[1], cpv.add(pos[2], pos[3])))
centerpos = [ sumpos[0]/4., sumpos[1]/4., sumpos[2]/4. ]
angles = [ [ 0., 0 ] ]
s00 = cpv.sub(pos[0], centerpos)
for i in range(1,4):
s = cpv.sub(pos[i], centerpos)
ang = cpv.get_angle(s00, s)
angles.append( [ ang, i] )
def sortfirst(a, b):
return cmp(a[0], b[0])
angles.sort(sortfirst)
verts = map(lambda x: x[1], angles)
vorder = [ verts[0], verts[1], verts[2],
verts[2], verts[3], verts[1] ]
# fill in the vertex data for the triangles;
for i in vorder:
obj.append(VERTEX)
obj.extend(pos[i])
# finish the CGO
obj.append(END)
# update the UI
newName = cmd.get_unused_name("backbonePlane")
cmd.load_cgo(obj, newName)
cmd.set("cgo_transparency", transp, newName)
cmd.extend("bbPlane", bbPlane)