### Identify rotatable bonds ### rotatable_bonds = struc.find_rotatable_bonds(residue.bonds) # Do not rotate about backbone bonds, # as these are irrelevant for a amino rotamer library for atom_name in BACKBONE: index = np.where(residue.atom_name == atom_name)[0][0] rotatable_bonds.remove_bonds_to(index) print("Rotatable bonds in tyrosine:") for atom_i, atom_j, _ in rotatable_bonds.as_array(): print(residue.atom_name[atom_i] + " <-> " + residue.atom_name[atom_j]) ### VdW radii of each atom, required for the next step ### vdw_radii = np.zeros(residue.array_length()) for i, element in enumerate(residue.element): vdw_radii[i] = info.vdw_radius_single(element) # The Minimum required distance between two atoms is mean of their # VdW radii vdw_radii_mean = (vdw_radii[:, np.newaxis] + vdw_radii[np.newaxis, :]) / 2 ### Rotate randomly about bonds ### np.random.seed(0) rotamer_coord = np.zeros((LIBRARY_SIZE, residue.array_length(), 3)) for i in range(LIBRARY_SIZE): # Coordinates for the current rotamer model coord = residue.coord.copy() for atom_i, atom_j, _ in rotatable_bonds.as_array(): # The bond axis axis = coord[atom_j] - coord[atom_i] # Position of one of the involved atoms support = coord[atom_i]
normalized_charges = charges.copy() # Show no partial charge for atoms # that are not parametrized for the PEOE algorithm normalized_charges[np.isnan(normalized_charges)] = 0 # Norm charge values to highest absolute value max_charge = np.max(np.abs(normalized_charges)) normalized_charges /= max_charge # Transform range (-1, 1) to range (0, 1) normalized_charges = (normalized_charges + 1) / 2 # Calculate colors color_map = plt.get_cmap(CMAP_NAME) colors = color_map(normalized_charges) # Ball size should be proportional to VdW radius of the respective atom ball_sizes = np.array( [info.vdw_radius_single(e) for e in molecule.element] ) * BALL_SCALE # Gradient of ray strength # The ray size is proportional to the absolute charge value ray_full_sizes = ball_sizes + np.abs(charges) * RAY_SCALE ray_sizes = np.array([ np.linspace(ray_full_sizes[i], ball_sizes[i], N_RAY_STEPS, endpoint=False) for i in range(molecule.array_length()) ]).T # The plotting begins here fig = plt.figure(figsize=(8.0, 6.0)) ax = fig.add_subplot(111, projection="3d")
def test_single_radii(): assert strucinfo.vdw_radius_single("N") == 1.55
# Later this variable stores values between 0 and 1 for use in color map normalized_charges = charges.copy() # Show no partial charge for atoms # that are not parametrized for the PEOE algorithm normalized_charges[np.isnan(normalized_charges)] = 0 # Norm charge values to highest absolute value max_charge = np.max(np.abs(normalized_charges)) normalized_charges /= max_charge # Transform range (-1, 1) to range (0, 1) normalized_charges = (normalized_charges + 1) / 2 # Calculate colors color_map = plt.get_cmap(CMAP_NAME) colors = color_map(normalized_charges) # Ball size should be proportional to VdW radius of the respective atom ball_sizes = np.array([info.vdw_radius_single(e) for e in molecule.element]) * BALL_SCALE # Gradient of ray strength # The ray size is proportional to the absolute charge value ray_full_sizes = ball_sizes + np.abs(charges) * RAY_SCALE ray_sizes = np.array([ np.linspace(ray_full_sizes[i], ball_sizes[i], N_RAY_STEPS, endpoint=False) for i in range(molecule.array_length()) ]).T # The plotting begins here fig = plt.figure(figsize=(8.0, 6.0)) ax = fig.add_subplot(111, projection="3d") # Plot the atoms