1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125
|
from pymol.cgo import *
from pymol import cmd
from chempy.cpv import normalize, cross_product, add, scale
from math import sqrt
# pore through a membrane
radius = 19.0
edge = 70.0
sampling = 6
depth = 20.0
obj = []
for z1 in [0.0, depth]:
for basis in [ [ [ 1.0, 0.0, 0.0], [ 0.0, 1.0, 0.0], 0],
[ [ 0.0, 1.0, 0.0], [ -1.0, 0.0, 0.0], 0],
[ [-1.0, 0.0, 0.0], [ 0.0, -1.0, 0.0], 0],
[ [ 0.0, -1.0, 0.0], [ 1.0, 0.0, 0.0], 0],
[ [ 1.0, 0.0, 0.0], [ 0.0, 1.0, 0.0], 1],
[ [ 0.0, 1.0, 0.0], [ -1.0, 0.0, 0.0], 1],
[ [-1.0, 0.0, 0.0], [ 0.0, -1.0, 0.0], 1],
[ [ 0.0, -1.0, 0.0], [ 1.0, 0.0, 0.0], 1],
]:
hand = basis[2]
if hand:
if z1 == 0.0:
(x,y) = basis[0:2]
else:
(y,x) = basis[0:2]
normal = normalize(cross_product(x,y))
else:
if z1 == 0.0:
(y,x) = basis[0:2]
else:
(x,y) = basis[0:2]
normal = normalize(cross_product(y,x))
obj.extend( [BEGIN, TRIANGLE_STRIP] +
[COLOR, 1.0, 1.0, 1.0] +
[NORMAL] + normal )
for i in range(sampling+1):
x1 = edge
y1 = edge*i/sampling
vlen = sqrt(x1*x1+y1*y1)
x0 = radius*x1/vlen
y0 = radius*y1/vlen
v0 = add( add( scale(x, x0 ), scale(y,y0) ), scale(normal,z1) )
v1 = add( add( scale(x, x1 ), scale(y,y1) ), scale(normal,z1) )
if hand:
obj.extend( [ VERTEX ] + v0 + [ VERTEX ] + v1 )
else:
obj.extend( [ VERTEX ] + v1 + [ VERTEX ] + v0 )
obj.extend( [END] )
obj.extend( [BEGIN, TRIANGLE_STRIP] +
[COLOR, 1.0, 1.0, 1.0])
for i in range(sampling+1):
x1 = edge
y1 = edge*i/sampling
vlen = sqrt(x1*x1+y1*y1)
n0 = add( scale(x,-x1/vlen), scale(y, -y1/vlen) )
x0 = radius*x1/vlen
y0 = radius*y1/vlen
v0 = add( scale(x, x0), scale(y,y0) )
v1 = add( add( scale(x, x0), scale(y,y0) ), scale(normal,z1) )
obj.extend( [ NORMAL] + n0 )
if hand:
obj.extend( [ VERTEX ] + v0 + [ VERTEX ] + v1 )
else:
obj.extend( [ VERTEX ] + v1 + [ VERTEX ] + v0 )
obj.extend( [END] )
obj.extend( [BEGIN, TRIANGLE_STRIP] +
[COLOR, 1.0, 1.0, 1.0])
for i in range(sampling+1):
x1 = edge
y1 = edge*i/sampling
vlen = sqrt(x1*x1+y1*y1)
n0 = scale(x, 1.0/edge)
v0 = add( scale(x, x1), scale(y,y1) )
v1 = add( add( scale(x, x1), scale(y,y1) ), scale(normal,z1) )
obj.extend( [ NORMAL] + n0 )
if not hand:
obj.extend( [ VERTEX ] + v0 + [ VERTEX ] + v1 )
else:
obj.extend( [ VERTEX ] + v1 + [ VERTEX ] + v0 )
obj.extend( [END] )
# then we load it into PyMOL
cmd.load_cgo(obj,'cgo06')
# position haemolysin through pore
if 1:
cmd.fetch("7ahl")
cmd.transform_selection("7ahl",
(0.70349078502033213, 0.19033556773811347, -0.68474258132841503, -11.993190038310882,
-0.15869362855324043, 0.98121371667870472, 0.10970571819737528, -29.939406659327624,
0.69276001846262825, 0.03148755047390385, 0.72048024614206196, -26.250180846754432,
0.0, 0.0, 0.0, 1.0))
cmd.show_as("cartoon","7ahl")
cmd.do("util.cbc")
cmd.set_view((\
-0.589197695, -0.440498680, 0.677344978,\
0.574851871, -0.817646086, -0.031699535,\
0.567794442, 0.370693058, 0.734975874,\
0.000004128, -0.000099868, -651.343872070,\
-4.874452114, 8.360315323, 11.387301445,\
528.689147949, 773.963684082, 0.000000000 ))
|