| 1 | import chimera
|
|---|
| 2 | from chimera import selection, replyobj
|
|---|
| 3 | from BondRotMgr import bondRotMgr
|
|---|
| 4 |
|
|---|
| 5 | pdbfile = chimera.openModels.open('./kk.pdb')
|
|---|
| 6 | mol = pdbfile[0]
|
|---|
| 7 | mybonds = ['#0:2.C@CP3,CPG','#0:2.C@CPG,OPA','#0:2.C@CPG,C01','#0:2.C@C01,C02']
|
|---|
| 8 | myatoms = ['#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 |
|
|---|
| 11 | mybondlist = []
|
|---|
| 12 | for addbond in mybonds:
|
|---|
| 13 | a1, a2 = selection.OSLSelection(addbond).atoms()
|
|---|
| 14 | bond = (set(a1.bonds)&set(a2.bonds)).pop()
|
|---|
| 15 | mybondlist.append(bond)
|
|---|
| 16 |
|
|---|
| 17 | torsionlist = []
|
|---|
| 18 | for mybond in mybondlist:
|
|---|
| 19 | torsionlist.append(bondRotMgr.rotationForBond(mybond))
|
|---|
| 20 |
|
|---|
| 21 | myatomlist = []
|
|---|
| 22 | for addatom in myatoms:
|
|---|
| 23 | thisatom = selection.OSLSelection(addatom).atoms()[0]
|
|---|
| 24 | myatomlist.append(thisatom)
|
|---|
| 25 |
|
|---|
| 26 | mycoordlist = []
|
|---|
| 27 | for 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 |
|
|---|
| 33 | gridData = {}
|
|---|
| 34 | from math import floor
|
|---|
| 35 | from numpy import array, float32
|
|---|
| 36 | from _contour import affine_transform_vertices
|
|---|
| 37 |
|
|---|
| 38 | spacing = 0.1
|
|---|
| 39 | pts = 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
|
|---|
| 43 | from numpy import floor, zeros
|
|---|
| 44 | pts = floor(pts/spacing + 0.5).astype(int)
|
|---|
| 45 |
|
|---|
| 46 | for pt in pts:
|
|---|
| 47 | center = tuple(pt)
|
|---|
| 48 | gridData[center] = gridData.get(center, 0) + 1
|
|---|
| 49 |
|
|---|
| 50 | # generate volume
|
|---|
| 51 | axisData = zip(*tuple(gridData.keys()))
|
|---|
| 52 | minXyz = [min(ad) for ad in axisData]
|
|---|
| 53 | maxXyz = [max(ad) for ad in axisData]
|
|---|
| 54 |
|
|---|
| 55 | # allow for zero-padding on both ends
|
|---|
| 56 | dims = [maxXyz[axis] - minXyz[axis] + 10 for axis in range(3)]
|
|---|
| 57 | print minXyz, maxXyz, dims
|
|---|
| 58 |
|
|---|
| 59 | from numpy import zeros, transpose
|
|---|
| 60 | volume = zeros(dims, int)
|
|---|
| 61 | for index, val in gridData.items():
|
|---|
| 62 | adjIndex = tuple([index[i] - minXyz[i] + 5 for i in range(3)])
|
|---|
| 63 | volume[adjIndex] = val
|
|---|
| 64 |
|
|---|
| 65 | from VolumeData import Array_Grid_Data
|
|---|
| 66 | # the "cushion of zeros" means d-5...
|
|---|
| 67 | gd = Array_Grid_Data(volume.transpose(), [(d-5) * spacing for d in minXyz], [spacing] * 3)
|
|---|
| 68 | gd.name = 'volumen'
|
|---|
| 69 |
|
|---|
| 70 | # show volume
|
|---|
| 71 | import VolumeViewer
|
|---|
| 72 | dataRegion = VolumeViewer.volume_from_grid_data(gd)
|
|---|
| 73 | vd = VolumeViewer.volumedialog.volume_dialog(create=True)
|
|---|
| 74 | vd.message("Volume can be saved from File menu")
|
|---|