Scripts: smoothMD.py

File smoothMD.py, 1.6 KB (added by pett, 15 years ago)
Line 
1# find the trajectory
2from Movie.gui import MovieDialog
3from chimera.extension import manager
4movies = [inst for inst in manager.instances if isinstance(inst, MovieDialog)]
5if len(movies) != 1:
6 raise AssertionError("not exactly one MD Movie")
7movie = movies[0]
8
9if hasattr(movie, 'findCoordSet'):
10 findCoordSet = movie.findCoordSet
11 LoadFrame = movie._LoadFrame
12else:
13 findCoordSet = movie.model.findCoordSet
14 LoadFrame = movie.model.LoadFrame
15
16# load all frames
17for frameNum in range(movie.startFrame, movie.endFrame+1):
18 if not findCoordSet(frameNum):
19 movie.status("loading frame %d" % frameNum)
20 LoadFrame(frameNum, makeCurrent=False)
21
22# fetch coords into arrays
23movie.status("fetching coords")
24atoms = movie.model._mol.atoms
25coords = []
26coordSets = []
27from chimera.match import _coordArray
28for fn in range(movie.startFrame, movie.endFrame+1):
29 cs = findCoordSet(fn)
30 coordSets.append(cs)
31 coords.append(_coordArray(atoms, coordSet=cs))
32
33# create an averaged equivalent
34movie.status("computing averages")
35window = 2 # number of adjacent frames to average
36averaged = []
37import numpy
38for i in range(len(coords)):
39 weightTot = 0
40 avg = numpy.zeros(coords[i].shape, type(coords[i][0]))
41 for j in range(i-window, i+window+1):
42 if j < 0 or j >= len(coords):
43 continue
44 weight = window + 1 - abs(i-j)
45 weightTot += weight
46 avg += weight * coords[j]
47 avg /= weightTot
48 averaged.append(avg)
49
50# set coords to averaged
51movie.status("setting coords")
52from chimera import Point
53for cs, avg in zip(coordSets, averaged):
54 for a, data in zip(atoms, avg):
55 a.setCoord(Point(*data), cs)
56
57movie.status("trajectory averaged")