Source code for schrodinger.structutils.residue
import itertools
from schrodinger import structure
[docs]def get_residues_between(res1: structure._Residue,
                         res2: structure._Residue) -> list:
    """
    Returns a list of `structure._Residue` objects between (and including)
    the specified residues by order of connectivity according to N->C order
    Note that residues must belong to the same chain and have the same molecule
    number, i.e., be really connected.
    :param res1: One of the residues in a connected sequence of residues
    :param res2: The other residue in a connected sequence of residues
    :raises ValueError: Residues must belong to the same chain and have the
                        same molecule number
    :return: The residues from one of the specified residues to the other, in
             N->C order.
    """
    if res1 == res2:
        return [res1]
    chain = res1.atom[1].getChain()
    if chain.name != res2.chain:
        raise ValueError("Specified residues are on different chains "
                         f"({res1.chain} and {res2.chain}).")
    st = res1.structure
    if st != res2.structure:
        raise ValueError("Specified residues belong to different structures.")
    if res1.molecule_number != res2.molecule_number:
        raise ValueError("Specified residues are not connected.")
    residues = structure.get_residues_by_connectivity(chain)
    not_start_or_end = lambda res: res not in (res1, res2)
    up_to_first_res = itertools.dropwhile(not_start_or_end, residues)
    first_res = next(up_to_first_res, None)
    last_res = res2 if res1 == first_res else res1
    residues_between = itertools.takewhile(not_start_or_end, up_to_first_res)
    return list(itertools.chain([first_res], residues_between, [last_res]))