| 1 | from chimerax.atomic import Residues, Atoms, selected_residues
|
|---|
| 2 | from math import sqrt
|
|---|
| 3 | import numpy
|
|---|
| 4 | models = selected_residues(session).unique_structures
|
|---|
| 5 | from chimerax.core.commands import run
|
|---|
| 6 |
|
|---|
| 7 | run(session, f'match {"|".join(["#"+m.id_string for m in models[1:]])} to #{models[0].id_string}')
|
|---|
| 8 |
|
|---|
| 9 | for residues in zip(*[m.residues for m in models]):
|
|---|
| 10 | residues = Residues(residues)
|
|---|
| 11 | pas = Atoms(residues.principal_atoms)
|
|---|
| 12 | if not len(pas):
|
|---|
| 13 | residues.atoms.bfactors = 0
|
|---|
| 14 | continue
|
|---|
| 15 |
|
|---|
| 16 | coords = pas.scene_coords
|
|---|
| 17 | avg = numpy.mean(coords, axis=0)
|
|---|
| 18 | deviations = coords-avg
|
|---|
| 19 | distances = numpy.linalg.norm(deviations, axis=0)
|
|---|
| 20 | rms = sqrt(numpy.mean(distances**2))
|
|---|
| 21 | residues.atoms.bfactors = rms
|
|---|
| 22 |
|
|---|
| 23 | run(session, f'color bfactor sel')
|
|---|