def torsions_from_atoms(atoms): """ Calculate and return phi and psi torsions for each residue. """ import vector import collections # The torsions list has the following structure: # torsions = [(phi, psi, residue), ...] torsions = [] RamaInfo = collections.namedtuple('RamaInfo', 'phi psi residue') num_residues = len(atoms) // 3 - 2 try: for i in range(1, num_residues): v1 = atoms[3 * i - 1].xyz v2 = atoms[3 * i + 0].xyz v3 = atoms[3 * i + 1].xyz v4 = atoms[3 * i + 2].xyz v5 = atoms[3 * i + 3].xyz phi = vector.torsion(v1, v2, v3, v4) psi = vector.torsion(v2, v3, v4, v5) residue = atoms[3 * i].residue rama_info = RamaInfo(phi, psi, residue) torsions.append(rama_info) except ZeroDivisionError: return [] else: return torsions
#!/usr/bin/env python2 import vector import math v1 = [36.886, 53.177, 21.887] v2 = [38.323, 52.817, 21.996] v3 = [38.493, 51.553, 22.830] v4 = [39.483, 50.748, 22.463] n1 = vector.normalize(v1) n2 = vector.normalize(v2) v1 = n1 = 1,2,3 v2 = n2 = 3,4,5 print vector.add(v1, v2) print vector.subtract(v1, v2) print vector.normalize(v1) print vector.dot(n1, n2) print vector.cross(n1, n2) print vector.torsion(v1, v2, v3, v4)
coordinate = x, y, z coordinates.append(coordinate) # Calculate all the phi and psi torsions. num_residues = len(coordinates) // 3 - 2 for i in range(1, num_residues): v1 = coordinates[3 * i - 1] v2 = coordinates[3 * i + 0] v3 = coordinates[3 * i + 1] v4 = coordinates[3 * i + 2] v5 = coordinates[3 * i + 3] phi = vector.torsion(v1, v2, v3, v4) psi = vector.torsion(v2, v3, v4, v5) phis.append(phi) psis.append(psi) # Generate the Ramachandran plot. pylab.plot(phis, psis, '.') pylab.xlabel('Phi') pylab.ylabel('Psi') pylab.xlim(-180, 180) pylab.ylim(-180, 180) pylab.xticks(range(-180, 181, 90)) pylab.yticks(range(-180, 181, 90)) pylab.grid(True)