Scripts: mapsum.py

File mapsum.py, 2.4 KB (added by goddard, 13 years ago)
Line 
1# Report average density around CA atoms.
2def report_atom_densities(atom_names = ('CA',), radii = (3,), grid_spacing = 0.3):
3
4 from chimera import openModels as om, Molecule
5 import VolumeViewer
6 mols = om.list(modelTypes = [Molecule])
7 maps = VolumeViewer.volume_list()
8 grids = [grid_points(r, grid_spacing) for r in radii]
9 for mol in mols:
10 print 'Molecule %s, ' % mol.name,
11 for map in maps:
12 atoms = [a for a in mol.atoms if a.name in atom_names]
13 rtext = ' '.join('%.4g'%r for r in radii)
14 ngtext = ' '. join('%d'%len(g) for g in grids)
15 print 'average density near %d atoms in map %s, ' % (len(atoms), map.name)
16 print 'radii %s, sampling grid spacing %.4g, grid points %s' % (rtext, grid_spacing, ngtext)
17 aves = [atom_densities(atoms, g, map) for g in grids]
18 for i,a in enumerate(atoms):
19 rid = a.residue.id
20 atext = ' '.join('%8.3g'%r_ave[i] for r_ave in aves)
21 print '%4d %4s %4s %s' % (rid.position, rid.chainId, a.name, atext)
22
23# Average density around atoms.
24def atom_densities(atoms, sampling_grid, map):
25
26 centers = atom_coordinates(atoms, map.openState.xform)
27 aves = average_density(centers, sampling_grid, map)
28 return aves
29
30# Compute atom coordinates in map coordinate system
31def atom_coordinates(atoms, map_xf):
32
33 xf = map_xf.inverse()
34 axyz = [xf.apply(a.xformCoord()).data() for a in atoms]
35 return axyz
36
37# Compute average density inside sphere using grid centered on sphere.
38def average_density(centers, sampling_grid, map):
39
40 n = len(sampling_grid)
41 aves = []
42 for c in centers:
43 v = map.interpolated_values(sampling_grid + c)
44 aves.append(float(v.sum())/n)
45 return aves
46
47# Produce array of grid points inside sphere centered at 0,0,0.
48def grid_points(radius, grid_spacing):
49
50 g = []
51 n = int(float(radius + grid_spacing)/grid_spacing)
52 r2 = radius*radius
53 for i in range(-n,n+1):
54 for j in range(-n,n+1):
55 for k in range(-n,n+1):
56 dx,dy,dz = i*grid_spacing,j*grid_spacing,k*grid_spacing
57 if dx*dx + dy*dy + dz*dz < r2:
58 g.append((dx,dy,dz))
59 import numpy
60 ga = numpy.array(g)
61 return ga
62
63# Report densities for open molecule and map.
64report_atom_densities(('CA','CB'), (3,5,7))
65from Accelerators import standard_accelerators as sa
66sa.show_reply_log()