Scripts: torspace.py

File torspace.py, 2.3 KB (added by pett, 16 years ago)
Line 
1import chimera
2from chimera import selection, replyobj
3from BondRotMgr import bondRotMgr
4
5pdbfile = chimera.openModels.open('./kk.pdb')
6mol = pdbfile[0]
7mybonds = ['#0:2.C@CP3,CPG','#0:2.C@CPG,OPA','#0:2.C@CPG,C01','#0:2.C@C01,C02']
8myatoms = ['#0:2.C@1H0','#0:2.C@1HPK','#0:2.C@2H0','#0:2.C@2HPK','#0:2.C@3H0','#0:2.C@C01','#0:2.C@C02','#0:2.C@C03','#0:2.C@CPG','#0:2.C@CPK','#0:2.C@HPG','#0:2.C@O02','#0:2.C@O03','#0:2.C@OPA']
9# Eric's alternative:
10
11mybondlist = []
12for addbond in mybonds:
13 a1, a2 = selection.OSLSelection(addbond).atoms()
14 bond = (set(a1.bonds)&set(a2.bonds)).pop()
15 mybondlist.append(bond)
16
17torsionlist = []
18for mybond in mybondlist:
19 torsionlist.append(bondRotMgr.rotationForBond(mybond))
20
21myatomlist = []
22for addatom in myatoms:
23 thisatom = selection.OSLSelection(addatom).atoms()[0]
24 myatomlist.append(thisatom)
25
26mycoordlist = []
27for torsion in torsionlist:
28 for angle in range(0,360,1):
29 torsion.increment(angle)
30 for atom in myatomlist:
31 mycoordlist.append(atom.coord())
32
33gridData = {}
34from math import floor
35from numpy import array, float32
36from _contour import affine_transform_vertices
37
38spacing = 0.1
39pts = array([a for a in mycoordlist], float32)
40
41# add a half-voxel since volume positions are
42# considered to be at the center of their voxel
43from numpy import floor, zeros
44pts = floor(pts/spacing + 0.5).astype(int)
45
46for pt in pts:
47 center = tuple(pt)
48 gridData[center] = gridData.get(center, 0) + 1
49
50# generate volume
51axisData = zip(*tuple(gridData.keys()))
52minXyz = [min(ad) for ad in axisData]
53maxXyz = [max(ad) for ad in axisData]
54
55# allow for zero-padding on both ends
56dims = [maxXyz[axis] - minXyz[axis] + 10 for axis in range(3)]
57print minXyz, maxXyz, dims
58
59from numpy import zeros, transpose
60volume = zeros(dims, int)
61for index, val in gridData.items():
62 adjIndex = tuple([index[i] - minXyz[i] + 5 for i in range(3)])
63 volume[adjIndex] = val
64
65from VolumeData import Array_Grid_Data
66# the "cushion of zeros" means d-5...
67gd = Array_Grid_Data(volume.transpose(), [(d-5) * spacing for d in minXyz], [spacing] * 3)
68gd.name = 'volumen'
69
70# show volume
71import VolumeViewer
72dataRegion = VolumeViewer.volume_from_grid_data(gd)
73vd = VolumeViewer.volumedialog.volume_dialog(create=True)
74vd.message("Volume can be saved from File menu")