| 1 | # find the trajectory
|
|---|
| 2 | from Movie.gui import MovieDialog
|
|---|
| 3 | from chimera.extension import manager
|
|---|
| 4 | movies = [inst for inst in manager.instances if isinstance(inst, MovieDialog)]
|
|---|
| 5 | if len(movies) != 1:
|
|---|
| 6 | raise AssertionError("not exactly one MD Movie")
|
|---|
| 7 | movie = movies[0]
|
|---|
| 8 |
|
|---|
| 9 | if hasattr(movie, 'findCoordSet'):
|
|---|
| 10 | findCoordSet = movie.findCoordSet
|
|---|
| 11 | LoadFrame = movie._LoadFrame
|
|---|
| 12 | else:
|
|---|
| 13 | findCoordSet = movie.model.findCoordSet
|
|---|
| 14 | LoadFrame = movie.model.LoadFrame
|
|---|
| 15 |
|
|---|
| 16 | # load all frames
|
|---|
| 17 | for 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
|
|---|
| 23 | movie.status("fetching coords")
|
|---|
| 24 | atoms = movie.model._mol.atoms
|
|---|
| 25 | coords = []
|
|---|
| 26 | coordSets = []
|
|---|
| 27 | from chimera.match import _coordArray
|
|---|
| 28 | for 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
|
|---|
| 34 | movie.status("computing averages")
|
|---|
| 35 | window = 2 # number of adjacent frames to average
|
|---|
| 36 | averaged = []
|
|---|
| 37 | import numpy
|
|---|
| 38 | for 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
|
|---|
| 51 | movie.status("setting coords")
|
|---|
| 52 | from chimera import Point
|
|---|
| 53 | for cs, avg in zip(coordSets, averaged):
|
|---|
| 54 | for a, data in zip(atoms, avg):
|
|---|
| 55 | a.setCoord(Point(*data), cs)
|
|---|
| 56 |
|
|---|
| 57 | movie.status("trajectory averaged")
|
|---|