Source code for schrodinger.structutils.interactions.protein_protein_interactions

from schrodinger import structure
from schrodinger.structutils import analyze


[docs]def get_interface_atoms(structs, dist=4.5): """ Returns a list of protein interface atoms found in specified structures Protein interface atoms are atoms close to an atom in a different chain, whether the same protein or not. All atoms in a residues are included if any atom in it meets this criterion. :param structs: list of structures to examine :type structs: list[schrodinger.structure.Structure] :param cutoff: The minimum number of atoms in the chain to be considered :param cutoff: int :param dist: The distance used in the definition of "close" :type dist: float :rtype: list[schrodinger.structure._StructureAtom] :return: a list of interface atoms that belong to chains with more than cutoff residues """ structs = list(structs) # Create a structure that contains all the structures, keeping a mapping so # we can return atoms in the original structures index_map = {} merged = structure.create_new_structure() for st in structs: index_map.update( (at, i) for (i, at) in enumerate(st.atom, start=merged.atom_total + 1)) merged.extend(st) back_map = {i: at for at, i in index_map.items()} # Now find the interface atoms for each chain in the merged structure and # map them to the original structures protein_atom_indices = set(analyze.evaluate_asl(merged, "protein")) interface_atoms = set() for st in structs: for chain in st.chain: chain_atoms = (index_map[a] for a in chain.atom) chain_atoms = [i for i in chain_atoms if i in protein_atom_indices] if not chain_atoms: continue chain_asl = analyze.generate_asl(merged, chain_atoms) close_asl = (f"(protein) and (fillres (within {dist} ({chain_asl}))" f"and not ({chain_asl}))") close_atom_indices = analyze.evaluate_asl(merged, close_asl) interface_atoms.update(back_map[i] for i in close_atom_indices) return interface_atoms